如何将中缀应用运算符转换为前缀函数?

时间:2014-07-24 22:50:37

标签: haskell operators

在下面的代码中,我修改了第一个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

2 个答案:

答案 0 :(得分:6)

<$>转换为前缀运算符后,<*>正在运行两个参数。第一个是左边的所有内容,(<$>) add (Just 1),第二个是右边的所有内容,(Just 2)。要将函数f作为前两个参数调用,我们写

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

如果我们将(<*>)替换为f,我们就会

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

fmap和liftA2

如果你真的想在没有中缀表示法的情况下写这个,首先你会注意到<$>只是中缀fmap,所以(<$>) = fmap

liftA2就是这种模式:

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

所以你也可以把它写成

liftA2 add (Just 1) (Just 2)

答案 1 :(得分:4)

您需要在精神上添加所涉及的父母:

     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)