我在编写符号时混淆纯函数和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
这不起作用,因为
y <- fb x
在z中行,但是将纯fb函数与monadic fa和fc函数结合起来的优雅方法是什么?
您可以做出的最小变化可能仍然有效:
z a = do x <- fa a let y = fb x z <- fc y return z
在这种特定情况下,您可以执行许多操作,这些操作在更一般的情况下可能无效.你可以"内联"这个电话fb
; 消除绑定/返回对; 并使用monadic组合而不是do-notation.将所有这三个付诸实践将会产生
z = fa >=> fc . fb
虽然您可以选择看起来合理/可读/美观的转换,以满足您的特定情况.