Haskell - Сумки - Как я могу использовать полиморфизм в Haskell? - PullRequest
0 голосов
/ 16 октября 2018

Я только начал изучать Haskell и до сих пор не понял функционального программирования.Мне нужно создать полиморфный тип данных, тип которого я не знаю, пока не запустится одна из написанных мной функций.Кажется, программа хочет, чтобы я создал список кортежей из списка, например:

['Car', 'Car', 'Motorcycle', 'Motorcycle', 'Motorcycle', 'Truck'] будет преобразовано в [('Car', 2), ('Motorcycle', 3), ('Truck', 1)].

в одном и том же списке кортежей (aсумка), все элементы будут одного типа, но разные сумки могут содержать другие типы.Прямо сейчас мое объявление типа данных (я не уверен, называется ли оно «объявлением» в FP):

type Amount = Int
data Bag a = [(a, Amount)]

Однако, когда я пытаюсь загрузить модуль, я получаю эту ошибку:

Cannot parse data constructor in a data/newtype declaration: [(a, Amount)]

Если в объявлении изменить data на type, я получу сообщение об ошибке для всех функций:

Expecting one more argument to ‘Bag’
Expected a type, but ‘Bag’ has kind ‘* -> *’

Есть ли что-то, чего я не понимаю в FP илиЭто ошибка кода? И что более важно, как я могу объявить это таким образом, чтобы фактически позволить мне загрузить модуль в GHCi?

1 Ответ

0 голосов
/ 16 октября 2018

Определение типа data

Речь идет не о самом функциональном программировании.Если вы определяете тип data (или newtype), в Haskell ему нужен конструктор данных (для newtype может быть только один конструктор данных и с однимпараметр).[(a, Amount)] однако не хорошее «имя» для конструктора данных (в любом случае, вы не намеревались использовать его в качестве конструктора данных).

Здесь мы можем написать конструктор данныхнапример:

data Bag a = <b>Bag</b> [(a, Amount)]

и поскольку здесь Bag содержит (вероятно) один конструктор данных с параметром one , мы можем сделать его newtype:

<b>newtype</b> Bag a = Bag [(a, Amount)]

Однако вышеописанное может быть необязательным: вы можете объявить тип псевдоним с type:

<b>type</b> Bag a = [(a, Amount)]

, в этом случае вы сделали , а не создать новый тип, но вы можете написать Bag a и «за кулисами», Haskell заменит это на [(a, Amount)].

Определите функции с Bag

В случаеТеперь вы хотите определить функцию, которая обрабатывает Bag, вам нужно будет указать также параметр a в сигнатуре, например:

count :: Eq a => [a] -> Bag <b>a</b>
count =  -- ...

Теперь ясно, что мы преобразуемсписок a с, в Bag из a с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...