flo*_*oAr 11 haskell do-notation
我试图在哈斯克尔去做一个do语句.我在这里找到了一些例子但是不能将它们应用到我的案例中.我唯一能想到的是一个沉重的嵌套let语句,看起来很难看.
应该用bind替换表示法的语句:
do num <- numberNode x
nt1 <- numberTree t1
nt2 <- numberTree t2
return (Node num nt1 nt2)
Run Code Online (Sandbox Code Playgroud)
任何输入都高度赞赏=)
Gab*_*lez 14
numberNode x >>= \num ->
numberTree t1 >>= \nt1 ->
numberTree t2 >>= \nt2 ->
return (Node num nt1 nt2)
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用Applicatives,这会更简单:
Node <$> numberNode x <*> numberTree t1 <*> numberTree t2
Run Code Online (Sandbox Code Playgroud)
这是适用风格的绝佳用例.您可以使用替换整个代码段(导入后Control.Applicative
)
Node <$> numberNode x <*> numberTree t1 <*> numberTree t2
Run Code Online (Sandbox Code Playgroud)
将应用样式(使用<$>
和<*>
)视为"提升"功能应用程序,因此它也适用于仿函数.如果你在心理上忽略它<$>
,<*>
它看起来很像正常的功能应用程序!
只要你有一个纯函数并且想要给它不纯的参数(或任何函子参数,真的),应用样式就很有用 - 基本上当你想要做你在问题中指定的内容时!
类型签名<$>
是
(<$>) :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
这意味着它需要一个纯函数(在这种情况下Node
)和一个函子值(在这种情况下numberNode x
),它创建一个包含在"内部"仿函数的新函数.您可以使用<*>
具有类型签名的函数向此函数添加更多参数
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这非常相似,<$>
即使函数被"包含在"函数中,它也可以正常工作.