Haskell用符号绑定

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)


kqr*_*kqr 8

这是适用风格的绝佳用例.您可以使用替换整个代码段(导入后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)

正如您所看到的,这非常相似,<$>即使函数被"包含在"函数中,它也可以正常工作.