5

美好的一天,伙计们。我正在寻求对 monads 的一些澄清,请使用 bind (在进入组合时.)。

所以对于这个例子:

--Monadic parts:
readFile :: String -> IO File
putStr :: String -> IO()
-- Non monadic parts
toMatrix :: String -> CustomMatrix
toString :: CustomMatrix -> String

本质上,我懒惰地读取文件 ( readFile),然后生成自定义矩阵,将矩阵转换为字符串输出。然后返回。

fileReading :: String -> IO
fileReading file = putStr(toString . toMatrix . readFile file)

这是我开始使用 bind >>=to go from 来制造混乱的时候readFile file。有没有一种方法可以让我继续使用合成.并绑定和组合而不会造成难以理解的混乱(这不是我的真正目标)。

与往常一样,我们将不胜感激地接受任何帮助。谢谢各位。

4

1 回答 1

8

在此示例中,如果不使用某些单子函数(如),您将无法逃脱。>>=如果您实际上想要最终执行一些 IO,则不能使用具有 IO 值的普通函数组合。

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

fileReading file = readFile file >>= putStr . toString . toMatrix

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

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

fileReading file = putStr . toString . toMatrix =<< readFile file

有些人发现这个版本更具可读性,因为所有代码都在同一个方向“流动”。

于 2013-03-21T18:06:23.043 回答