Я пытаюсь реализовать функцию, которая преобразует строку в список Maybe Ints, например. readInts "1 2 42 foo" = [Just 1,Just 2,Just 42,Nothing]
.
Мой первый подход был:
readInts (s::String) = do {
ws <- words s;
return (map (readMaybe::(String -> Maybe Int)) ws)
}
Это привело к следующей ошибке:
lab_monad.hs:20:52:
Couldn't match type ‘Char’ with ‘[Char]’
Expected type: [String]
Actual type: String
In the second argument of ‘map’, namely ‘ws’
In the first argument of ‘return’, namely
‘(map (readMaybe :: String -> Maybe Int) ws)’
Failed, modules loaded: none.
Далее я попробовал (и сработал):
readInts (s::String) = do {
let ws = (words s) in do
return (map (readMaybe::(String -> Maybe Int)) ws)
}
Мой вопрос здесь в том, что words s
, очевидно, имеет тип [String]
. Почему переводчик говорит, что это String
? Что я не понимаю в операторе <-
?
do
? - person Thomas   schedule 18.03.2018do
, даже если здесь это не лучшее решение. - person Tomasz Garbus   schedule 18.03.2018do
-нотация совершенно не имеет отношения к тому, что вы пытаетесь здесь сделать. Я рекомендую прочитать соответствующую главу LYAH, так как полное объяснение монад иdo
-нотации слишком широк для одного вопроса. - person AJF   schedule 18.03.2018map
. - person chepner   schedule 18.03.2018