getLine如何在haskell中工作?

Zub*_*air 0 io haskell functional-programming getline

看看Haskell Prelude中的定义getLine,我得到了递归的工作方式,在你点击换行符之前你一直要求一个字符,然后你构建一个列表然后返回包含在IO中.

但是我的问题是这些return语句在这种情况下是如何工作的,特别是return (c:....:return "")在你遇到基本情况时如何工作.你如何return ""进入清单?

che*_*ner 5

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)