2013-12-11 3 views
2

Какой тип и значение выражения:Что делает эту функцию получения

do [1,2,3]; "lambda" 

Я проверил это и обнаружил, что это просто печать лямбда 3 раза. Но я не понимаю, почему это так. Как я могу переписать его с помощью bind. Похоже, что нужно переписать его.

+1

Это домашнее задание? – augustss

+0

нет старый экзамен вопрос. , поэтому я думаю, что здесь можно попросить о помощи. – user2975699

ответ

6

Ваш код такой же, как

[1, 2, 3] >> "lambda" 

>> определяется как

m >> n = m >>= \_ -> n 

И >>= оператор определен для списков, как:

xs >>= f = concat (map f xs) 

Таким образом, код может быть переведено на:

concat $ map (const "lambda") [1, 2, 3] 

Который производит результат

"lambdalambdalambda" 
0

здесь тот же результат с безвыходном:

λ> [1,2,3] >>= \x -> "lambda" 
"lambdalambdalambda" 

Что вы ожидаете получить?

+0

Я не думал, что это сработает, потому что у нас нет возврата. Что такое λ> [1,2,3] >> = \ x -> "lambda" Мы привязываем список к функции, которая производит результат "лямбда". как он применяется три раза. – user2975699

+0

что такое λ>? И почему функция применяется три раза? – user2975699

+0

Ничего важного. Я видел это в учебнике по youtube и ему понравилось. Внутри ghci вы можете изменить настройку приглашения, запустив ': set prompt '. Чтобы ghci устанавливал его каждый раз, когда вы начинаете новый сеанс, вы можете добавить его в свой .ghci-файл в своем домашнем каталоге –

0

по определению списка монады,

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], и поэтому согласно указанной выше сигнатуре это тип результата.

Смежные вопросы