Haskell 如何将中缀应用运算符转换为前缀函数?
在下面的代码中,我修改了第一个LET语句,以便中缀运算符可以编写为前缀函数。我想对applicative操作符执行同样的操作,但无法将其编译。如果要将此运算符视为前缀函数,则将其放置在正确的位置Haskell 如何将中缀应用运算符转换为前缀函数?,haskell,operators,Haskell,Operators,在下面的代码中,我修改了第一个LET语句,以便中缀运算符可以编写为前缀函数。我想对applicative操作符执行同样的操作,但无法将其编译。如果要将此运算符视为前缀函数,则将其放置在正确的位置 module Main(main) where import Data.Functor import Control.Applicative main = do let y = add <$> (Just 1) <*> (Just 2) print y
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
主模块(Main),其中
导入数据。函子
导入控制
main=do
设y=add(仅1)(仅2)
打印y
--变成前缀运算符
让y=()加上(仅1)(仅2)
打印y
--如何转换为前缀运算符
--???
加上xy=x+y
您需要在心里添加相关的参数:
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)
只添加1只添加2只
≡ (仅添加1)仅添加2--通过左关联性(infixl 4,)
≡ (()添加(仅1))仅2
≡ foo Just 2——让foo=add Just 1
≡ ()富(只有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)
只添加1只添加2只
≡ (仅添加1)仅添加2--通过左关联性(infixl 4,)
≡ (()添加(仅1))仅2
≡ foo Just 2——让foo=add Just 1
≡ ()富(只有2个)
将
转换为前缀运算符后,
对两个参数进行操作。第一个是它左边的所有内容,()添加(仅1)
,第二个是它右边的所有内容,(仅2)
。要使用这两个参数调用函数f
,我们要编写
f ((<$>) add (Just 1)) (Just 2)
fmap和liftA2
如果您确实想在不使用中缀符号的情况下编写此代码,首先您可能会注意到
只是中缀fmap
,因此()=fmap
liftA2
正是这种模式:
liftA2 f a b = f <$> a <*> b
将
转换为前缀运算符后,
对两个参数进行操作。第一个是它左边的所有内容,()添加(仅1)
,第二个是它右边的所有内容,(仅2)
。要使用这两个参数调用函数f
,我们要编写
f ((<$>) add (Just 1)) (Just 2)
fmap和liftA2
如果您确实想在不使用中缀符号的情况下编写此代码,首先您可能会注意到
只是中缀fmap
,因此()=fmap
liftA2
正是这种模式:
liftA2 f a b = f <$> a <*> b
让y=()(()添加(仅1))(仅2)
但如果您向我们展示了您所尝试的内容,这样我们就可以解释它的问题,那就太好了。让y=()(()添加(仅1))(仅2)
但是如果您向我们展示了您所尝试的内容,这样我们就可以解释它的问题,那就太好了。如果我读对了,它可以重新编写为:()(()add(Just 1)(Just 2)
correct?@Keynan这不起作用,因为()期望它的第一个参数是f(a->b),而add只是(a->b)@leftaroundabout:这是针对Keynan的。很抱歉造成混淆。如果我阅读正确,可以将其改写为:()。()add(Just 1)(Just 2)
correct?@Keynan这不起作用,因为()希望它的第一个参数是f(a->b),而add只是(a->b)@leftaroundabout:这是针对Keynan的。很抱歉造成混淆。我没有尝试的一件事是将(*)放在($)之前。你所做的关键洞察(一旦你做到了就很明显)是,它正在对它左边的所有东西进行操作。非常感谢有一件事我没有尝试过,那就是把(*)放在($)之前。你所做的关键洞察(一旦你做到了就很明显)是,它正在对它左边的所有东西进行操作。非常感谢