【问题标题】:How do you turn the infix applicative operator into a prefix function?你如何将中缀应用运算符变成前缀函数?
【发布时间】:2014-07-24 22:50:36
【问题描述】:

在下面的代码中,我修改了第一个 LET 语句,以便可以将中缀运算符写为前缀函数。我想对应用运算符 做同样的事情,但无法让它编译。如果您想将此运算符视为前缀函数,那么放置此运算符的正确位置在哪里?

module Main(main) where

import Data.Functor
import Control.Applicative



main = do

   let y = add <$> (Just 1) <*> (Just 2)
   print y


   -- Turn <$> into a prefix operator
   let y = (<$>) add (Just 1) <*> (Just 2)
   print y


   --How do I turn <*> into a prefix operator
   --???


add x y = x + y

【问题讨论】:

  • let y = (&lt;*&gt;) ((&lt;$&gt;) add (Just 1)) (Just 2) 但如果你能向我们展示你尝试过的东西会很好,这样我们就可以用它来解释问题。

标签: haskell operators


【解决方案1】:

&lt;$&gt; 转换为前缀运算符后,&lt;*&gt; 对两个参数进行操作。第一个是它左边的所有东西,(&lt;$&gt;) add (Just 1),第二个是它右边的所有东西,(Just 2)。要调用函数f 并将这些作为前两个参数,我们会这样写

f ((<$>) add (Just 1)) (Just 2)

如果我们用(&lt;*&gt;) 代替f,我们得到

(<*>) ((<$>) add (Just 1)) (Just 2)

fmap 和 liftA2

如果你真的想写这个不带中缀符号,首先你会注意到&lt;$&gt;只是中缀fmap,所以(&lt;$&gt;) = fmap

liftA2 正是这种模式:

liftA2 f a b = f <$> a <*> b

所以你也可以这样写

liftA2 add (Just 1) (Just 2)

【讨论】:

  • 我没有尝试的一件事是将 (*) 放在 ($) 之前。你所做的关键见解(一旦你做到了就很明显)是 在它左边的所有东西上运行。非常感谢
【解决方案2】:

您需要在脑海中添加相关的括号:

     add <$> Just 1 <*> Just 2
   ≡ (add <$> Just 1) <*> Just 2      -- by left-associativity (infixl 4 <*>, <$>)
   ≡ ((<$>) add (Just 1)) <*> Just 2
   ≡ foo <*> Just 2                   -- let foo = add <$> Just 1
   ≡ (<*>) foo (Just 2)

【讨论】:

  • 如果我没看错的话可以改写为:(&lt;$&gt;) . (&lt;*&gt;) add (Just 1) (Just 2) 对吗?
  • @Keynan 这行不通,因为 () 期望它的第一个参数是 f (a->b) 而 add 只是 (a->b)
  • @leftaroundabout:这是针对 Keynan 的。很抱歉造成混乱。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2012-07-16
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多