Условия и обсуждение
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
.