在下面的代码中,我修改了第一个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
答案 0 :(得分:6)
将<$>
转换为前缀运算符后,<*>
正在运行两个参数。第一个是左边的所有内容,(<$>) add (Just 1)
,第二个是右边的所有内容,(Just 2)
。要将函数f
作为前两个参数调用,我们写
f ((<$>) add (Just 1)) (Just 2)
如果我们将(<*>)
替换为f
,我们就会
(<*>) ((<$>) add (Just 1)) (Just 2)
如果你真的想在没有中缀表示法的情况下写这个,首先你会注意到<$>
只是中缀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)