по определению списка монады,
do [1,2,3]; "lambda" -- "lambda" = ['l','a','m','b','d','a']
= [1,2,3] >>= (\x -> "lambda")
= [r | x <- [1,2,3], r <- "lambda"]
для списка монады return x = [x]
, и поэтому обычное потребительной случае
do x <- [1,2,3]; return x
= [r | x <- [1,2,3], r <- [x]]
получает ярлык только [x | x <- [1,2,3]]
. Это использует закон монады m >>= return = m
.
Но последнее монадическое значение в do
последовательности типа m a
(здесь, [a]
), не должен быть синглтон список. Он может быть пустым или содержать несколько элементов.
Что касается типа результата, то это [Char]
. Прежде всего, do
представляет собой связывания цепи, и тип связывает является
(>>=) :: m a -> (a -> m b) -> m b
Так как в вашем примере монадических значения списки, мы приходим к выводу, что m = []
. Последнее значение имеет тип String
, который равен [Char]
, и поэтому согласно указанной выше сигнатуре это тип результата.
Это домашнее задание? – augustss
нет старый экзамен вопрос. , поэтому я думаю, что здесь можно попросить о помощи. – user2975699