169 похожих чатов

Привет! Два месяца назад я прошёл на Степике первую часть

курсов по Хаскелю (и даже начал вторую), и вроде немного приноровился оперировать некоторыми понятиями.
И вот, давеча, дошло дело до собеседования (которое будет через неделю), и я решил попробовать решить задание для лайвкодинга и понял, что не знаю, как использовать структуры и типы данных адекватно (без хардкода на десятки паттерн мэтчей).
Условия написаны крайне неудовлетворительно, но, как я понял, это просто задумка, которую должен развивать интервьюер.

Смысл задания в следющем: есть парковочные места (Small, Compact, Large) и транспорт (Motorcycle, Car, Van). Для расположения мотоцикла можно использовать любое место (и оно будет считаться занятым) etc. - принцип понятен. Для расположения, например, фургона (вэна) можно использовать 3 обычных места (ну, или, например, 6 маленьких), или, собственно, одно большое.

Я начал делать и вот что получилось:

{-# LANGUAGE GADTs #-}

module Parking where

data Vehicle = Motorcycle | Car | Van deriving (Show, Eq)

data SpotType = Small | Compact | Large deriving (Show, Eq)

data Spot a where
Spot :: {spotType :: SpotType, vehicle :: Vehicle} -> Spot a
-- CompactSpot :: {spotType :: SpotType, vehicle :: Vehicle} -> Spot a
-- LargeSpot :: {spotType :: SpotType, vehicle :: Vehicle} -> Spot a
deriving (Show, Eq)

data ParkingLot a where
ParkingLot :: {spots :: [Spot a]} -> ParkingLot a

testData :: ParkingLot a
testData =
ParkingLot
[ Spot Small Motorcycle,
Spot Compact Car,
Spot Large Van,
Spot Small Motorcycle
]

Собственно, я попытался было ввести ограничения по располагаемым на парковочном месте объектам (по заветам ChatGPT), но получилось не очень.

data Spot a where
SmallSpot :: (a ~ 'Small, b ~ 'Motorcycle) => {spotType :: SpotType, vehicle :: Vehicle} -> Spot (a,b)
...

И даже если бы это сработало, остаётся неясно, каким образом ввести, условно, расширение, позволяющее использовать, например, 3 обычных места в качестве одного - для фургона.

Дисклеймер: мои знания крайне рандомные, так как я самоучка во всех смыслах (собственно, это, наверно, и подводит).

Вопрос, правильно ли я думаю, что надо вводить данные ограничения именно в структурах данных? Если да, то покажите, пожалуйста, как (если нет - всё равно покажите как это работает, если такое имеет место быть). И чтобы мне такое поделать, чтобы пройтись по этому пласту знаний (может статьи, книги подскажете).

А ещё хочу, чтобы вы немного пояснили: я на автомате написал Spot a хотя, можно было просто сделать Spot. Звучит глупо, но я понимаю общую параметризацию только на примере списка, и вопрос: я сделал общую параметризацию для того, чтобы в будущем мог вводить алгебраические описания типа функтора, аппликатива etc.?

2 ответов

23 просмотра

в чём именно задание? сформулировать эти правила в виде компайл-тайм ограничений?

Λ- Автор вопроса
Критерий Вычисλимости
в чём именно задание? сформулировать эти правила в...

Ну, собственно, по ссылке есть задача: условия написаны неоднозначно. Есть типы транспорта и типы парковочных мест. Моя идея была в том, чтобы сделать из них тип с тремя конструкторами, который не позволит, например, на маленькое место поставить фургон.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта