Не понимаю, что в этом коде haskell - PullRequest
0 голосов
/ 05 марта 2019

У меня есть некоторый код на Haskell, который я пытаюсь работать, но я не понимаю, что в нем происходит.

type Bag a = a -> Int

emptyB :: Bag a
emptyB = \e -> 0

countB :: Eq a => Bag a -> a -> Int
countB b e = b e

Я понимаю, что тип Bag - это функция, которая принимает универсальный объект и возвращает Int, а countB - это в основном оболочка для Bag, которая получает количество универсальных объектов в этом Bag.Но я действительно ничего не понимаю после этого.Как я могу изменить то, что в сумке?Или сама сумка?Из того, что я полагаю, добавление в пакет будет выглядеть примерно так:

addB :: Eq a => Bag a -> a -> Bag a
addB bag num = bag (num+bag) 

Но это возвращает int, когда функция добавления требует возврата пакета.Может кто-нибудь объяснить мне, как это работает?

1 Ответ

0 голосов
/ 05 марта 2019

Условия и обсуждение

type Bag a = a -> Int

Здесь Bag не является объектом.Это просто тип - псевдоним для a -> Int.Если у вас есть значение типа a, оно вычислит и вернет значение типа Int.Вот и все.Нет сумки, нет структуры, в которую можно добавлять вещи.Было бы лучше даже не называть это Bag.

emptyB :: Bag a
emptyB = \e -> 0

Функция любого типа с постоянным числом ноль.

countB :: Eq a => Bag a -> a -> Int
countB b e = b e

Короче говоря, это просто приложение функции.Примените функцию с именем b к входу e.

Перезапись для развлечения и обучения

Я ценю, что вы можете использовать функции для имитации структур - этообщее назначение класса языка программирования.Вы можете взять Bag a и еще один Bag a, а затем объединить их, например, возвращая новый countB, добавив количество двух отдельных сумок - круто.

... но это кажется слишком большим,Перед тем, как продолжить выполнение задания (я догадался, правильно?), Вам, вероятно, следует немного освоиться с основами.

Возможно, будет проще, если вы переписываете функции без псевдонима типа:

emptyB :: a -> Int
emptyB = \e -> 0
-- or: emptyB e = 0
-- or: emptyB _ = 0
-- or: emptyB = const 0

Bag или no bag, это просто функция.

countB :: Eq a => (a -> Int) -> a -> Int
countB b e = b e

Функция, которая принимает a и выдает Int, может ... может иметь значение (переменная * 1039)* имеет тип a) и производит Int.

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