“let…”和“let…”有什么区别。。在do`和'<;-`'中Haskell单子中的符号?
我正在尝试实现一个函数,该函数将字符串转换为可能的整数列表,例如,“let…”和“let…”有什么区别。。在do`和'<;-`'中Haskell单子中的符号?,haskell,compiler-errors,monads,type-mismatch,do-notation,Haskell,Compiler Errors,Monads,Type Mismatch,Do Notation,我正在尝试实现一个函数,该函数将字符串转换为可能的整数列表,例如,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) } 我下一步尝试(并成功)的是: 我的问题是,单词s显然属于[String]类型。为什么解
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)
}
我下一步尝试(并成功)的是:
我的问题是,
单词s
显然属于[String]
类型。为什么解释器说它是一个字符串
?关于wsws,我有什么不理解的地方?你为什么要在这里使用do
符号?学习如何使用do
符号,即使它不是这里的最佳解决方案。@TomaszGarbusdo
-符号与你在这里试图做的事情完全无关。我建议阅读,因为对单子和do的完整解释对于一个问题来说太宽泛了;它只是错误地混合了一元运算和map
。潜在的相关问题:你为什么要首先尝试在这里使用do
符号?要了解如何使用do
符号,即使它不是这里的最佳解决方案。@TomaszGarbusdo
-符号与您在这里试图做的事情完全无关。我建议阅读,因为对单子和do的完整解释对于一个问题来说太宽泛了;它只是错误地混合了一元运算和map
。可能相关:
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)
}
readInts s = do
ws <- words s -- ws represents *each* word in words s
return (readMaybe ws)
readInts s = words s >>= (\ws -> return (readMaybe ws))
readInts s = map readMaybe (words s)
let x = y + z in f x
(\x -> f x) (y + z)
^ ^ ^
| | |
| | RHS of let binding
| part after "in"
LHS of let binding
let x = y + z
a = b + c
in x + a
let x = y + z
in let a = b + c
in x + a
(\x -> (\a -> x + a)(b + c))(y + z)