Zub*_*air 0 io haskell functional-programming getline
看看Haskell Prelude中的定义getLine,我得到了递归的工作方式,在你点击换行符之前你一直要求一个字符,然后你构建一个列表然后返回包含在IO中.
但是我的问题是这些return语句在这种情况下是如何工作的,特别是return (c:....:return "")在你遇到基本情况时如何工作.你如何return ""进入清单?
return不像大多数语言那样是一种控制结构.它是monadic值的构造函数.我们来看看它的类型:
return :: Monad m => a -> m a
Run Code Online (Sandbox Code Playgroud)
在这种情况下,给定一个String值,它产生一个IO String值.
事实return是在每个分支中评估的最后一个表达if并不意味着return结束执行; 其他表达式可能会发生return.从monad列表中考虑这个简单的例子:
foo :: Int -> Int -> [Int]
foo x y = return x ++ return y
Run Code Online (Sandbox Code Playgroud)
在列表monad中,return只需创建一个包含其参数的新单项列表.然后将这两个列表连接到函数返回的最终结果列表中.
$ return 3 :: [Int]
[3]
$ foo 3 4
[3,4]
Run Code Online (Sandbox Code Playgroud)