use*_*519 4 io monads haskell functional-programming
我正在使用readFileHaskell中提供的函数从文件中读取一些数据.但是这个函数会返回一些存储为的数据IO String.有谁知道我如何将这些数据转换为一种String类型(或String从文件中读取的任何函数,没有IO ()类型)?
npo*_*cop 19
关于从monadic值中提取数据这是一个非常普遍的问题.
一般的想法是使用>>=功能:
main = readFile foo >>= \s -> print s
Run Code Online (Sandbox Code Playgroud)
>>=需要2个参数.它从第一个参数中提取值并将其传递给第二个参数.第一个参数是monadic值,在这种情况下是类型IO String,第二个参数是一个接受普通非monadic值的函数,在本例中String.
此模式有一种特殊语法:
main = do
s <- readFile foo
print s
Run Code Online (Sandbox Code Playgroud)
但其含义与上述相同.该do符号是为初学者和对某些复杂的情况下更方便,但明确的应用程序>>=可能会导致更短的代码.例如,此代码可以只写
main = readFile foo >>= print
Run Code Online (Sandbox Code Playgroud)
还有一大类库函数可以在monadic和非monadic值之间进行转换.其中最重要的是return,fmap,liftM2和>=>.
除了以引用透明的方式表示IO之外,monad的概念非常有用:这些帮助程序对于错误处理非常有用,处理隐式状态和monad的其他应用程序.
第二重要的单子是Maybe.