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.有没有办法我可以继续使用复合材料.,绑定和组合而不会造成难以理解的混乱(不是我真正的目标).
一如既往,感谢任何帮助.谢谢大家.
在这个例子中,如果不使用某些 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)
有些人发现这个版本更具可读性,因为所有代码都"流向"同一个方向.
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |