2015-12-02 50 views
2

我在混合符号里面使用纯函数和monadic函数时遇到了困难。我有这种感觉,我失去了一些明显的东西。在符号中用纯函数混合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 

这并不是因为z上的

y <- fb x 

线的工作,但什么是组合了纯FB功能的一种优雅的方式,与monadic fa和fc函数?

+0

出了什么问题'让Y = FB x'? – 9000

+0

围绕单个变量的Parens总是多余的,在'return(z)'中以及它们将在'fa a'中。在Haskell中,通常认为它只在需要时才使用括号(当然,除非你是麻省理工大二年级学生)(http://www.willamette.edu/~fruehr/haskell/evolution.html))! – leftaroundabout

+0

@leftaroundabout正确的你! – Xeli

回答

7

也许你可以和有它仍然可以工作的最小变化是这样的:

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

有很多的事情可以做,在这个具体情况下,这可能不适用于更一般的情况。您可以“联线”fb;消除绑定/返回对;并使用monadic组合而不是do-notation。把所有这三个实践将产生

z = fa >=> fc . fb 

虽然你可以选择这一点似乎是合理的/可读/美观为您的特定情况下的转换。

+0

感谢您的选择,您将如何亲自决定如何编写它? – Xeli

1

使用let非一元绑定:

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

我这样写这个特殊的例子:

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

z a = fa a >>= fc . fb