Как сделать следующее объявление списка монады?Правильное определение класса монады
module Main where
instance Monad m where
-- "return" constructs a one-item list.
return x = [x]
-- "bind" concatenates the lists obtained by applying f to each item in list xs.
xs >>= f = concat (map f xs)
-- The zero object is an empty list.
mzero = []
В настоящее время я получаю следующее сообщение об ошибке:
monad_ex1.hs:9:3: ‘mzero’ is not a (visible) method of class ‘Monad’
Мой код из https://en.wikipedia.org/wiki/Monad_(functional_programming)#Collections, цель состоит в том, чтобы запустить создать компилируемый код этого, импортировать его в GHCI и поиграйте с ним.
Удаление mzero из кода приводит к другому зашифрованному сообщению:
Illegal instance declaration for ‘Monad m’
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use FlexibleInstances if you want to disable this.)
In the instance declaration for ‘Monad m’
Как говорится в ошибке, монады не имеют «нулевого объекта» или «mzero». – melpomene
'instance Monad m' сделает все возможные типы' m' экземпляром 'Monad'. Вам понадобится «экземпляр Monad []', но это уже существует в стандартной библиотеке. Вы должны определить свой собственный класс или свой собственный тип, чтобы иметь возможность предоставить такой экземпляр. – melpomene
Мне непонятно, почему вы добавили это «mzero» при определении экземпляра для класса типа monad. – BarbedWire