Haskell do表示法中一元函数与纯函数的混合

Haskell do表示法中一元函数与纯函数的混合,haskell,coding-style,do-notation,Haskell,Coding Style,Do Notation,我在do符号中混合纯函数和一元函数时遇到问题。我觉得我错过了一些明显的东西 例如,假设我得到了这些函数 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 fa::a->IO b fb::b->c fc::c->IO d z::a->I

我在do符号中混合纯函数和一元函数时遇到问题。我觉得我错过了一些明显的东西

例如,假设我得到了这些函数

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
fa::a->IO b
fb::b->c
fc::c->IO d
z::a->IO c

z a=do x对于非单体绑定使用
let

z :: a -> IO c
z a = do x <- fa a
         let y = fb x
         z <- fc y
         return (z)
z::a->IO c

z a=do x可能你能做的最小的改变是:

z a = do x <- fa a
         let y = fb x
         z <- fc y
         return z

尽管您可以根据您的具体情况选择合理/可读/美观的转换。

我会这样写这个特定示例:

z a = do x <- fa a
         fc $ fb x

让y=fb x
有什么问题?在
返回(z)
中,以及在
fa a
中,围绕单个变量的参数总是多余的。在Haskell中,通常认为只有在必要时才使用括号才是好的风格(当然,除非是这样)@你是对的!感谢您的选择,您个人将如何决定如何编写它?
z = fa >=> fc . fb
z a = do x <- fa a
         fc $ fb x
z a = fa a >>= fc . fb