将monad绑定到复合材料(Haskell)

Bro*_*wnE 5 monads haskell bind composite

美好的一天.我正在寻求对monads的一些澄清,并使用bind(在进入复合材料时.)请.

所以对于这个例子:

--Monadic parts:
readFile :: String -> IO File
putStr :: String -> IO()
-- Non monadic parts
toMatrix :: String -> CustomMatrix
toString :: CustomMatrix -> String
Run Code Online (Sandbox Code Playgroud)

基本上我懒得读取一个文件(readFile)然后生成一个自定义矩阵,将矩阵转换为字符串输出.然后回来.

fileReading :: String -> IO
fileReading file = putStr(toString . toMatrix . readFile file)
Run Code Online (Sandbox Code Playgroud)

这是我开始通过使用bind >>=来创建一个混乱的时候readFile file.有没有办法我可以继续使用复合材料.,绑定和组合而不会造成难以理解的混乱(不是我真正的目标).

一如既往,感谢任何帮助.谢谢大家.

Tik*_*vis 7

在这个例子中,如果不使用某些 monadic函数(例如>>=),就无法逃脱.如果您真的想要最终执行某些IO,则不能将正常的函数组合与IO值一起使用.

令人高兴的是,您仍然可以相当容易地编写代码:

fileReading file = readFile file >>= putStr . toString . toMatrix
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为这两个.操作将两个非IO函数与最终的IO函数组合在一起.此时,您有两个IO值:一个IO String和一个String -> IO ()函数(整个putStr . toString . toMatrix表达式具有该类型).这正是>>=需要的,所以你已经准备好了.

如果您希望代码具有与上面相同的顺序,则可以使用向后绑定运算符:

fileReading file = putStr . toString . toMatrix =<< readFile file
Run Code Online (Sandbox Code Playgroud)

有些人发现这个版本更具可读性,因为所有代码都"流向"同一个方向.