在编号中将monadic函数与纯函数混合使用

Xel*_*eli 3 haskell coding-style do-notation

我在编写符号时混淆纯函数和monadic函数时遇到了麻烦.我有一种感觉,我错过了一些明显的东西.

例如,假设我有这些功能

fa :: a -> IO b
fb :: b -> c
fc :: c -> IO d

z :: a -> IO c
z a = do x <- fa a
         y <- fb x
         z <- fc y
         return z
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为

y <- fb x
Run Code Online (Sandbox Code Playgroud)

在z中行,但是将纯fb函数与monadic fa和fc函数结合起来的优雅方法是什么?

Dan*_*ner 7

您可以做出的最小变化可能仍然有效:

z a = do x <- fa a
         let y = fb x
         z <- fc y
         return z
Run Code Online (Sandbox Code Playgroud)

在这种特定情况下,您可以执行许多操作,这些操作在更一般的情况下可能无效.你可以"内联"这个电话fb; 消除绑定/返回对; 并使用monadic组合而不是do-notation.将所有这三个付诸实践将会产生

z = fa >=> fc . fb
Run Code Online (Sandbox Code Playgroud)

虽然您可以选择看起来合理/可读/美观的转换,以满足您的特定情况.