“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]
类型。为什么解释器说它是一个
字符串
?关于
ws
ws,我有什么不理解的地方?你为什么要在这里使用
do
符号?学习如何使用
do
符号,即使它不是这里的最佳解决方案。@TomaszGarbus
do
-符号与你在这里试图做的事情完全无关。我建议阅读,因为对单子和do的完整解释对于一个问题来说太宽泛了;它只是错误地混合了一元运算和
map
。潜在的相关问题:你为什么要首先尝试在这里使用
do
符号?要了解如何使用
do
符号,即使它不是这里的最佳解决方案。@TomaszGarbus
do
-符号与您在这里试图做的事情完全无关。我建议阅读,因为对单子和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)