Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将中缀应用运算符转换为前缀函数?_Haskell_Operators - Fatal编程技术网

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

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

在下面的代码中,我修改了第一个LET语句,以便中缀运算符可以编写为前缀函数。我想对applicative操作符执行同样的操作,但无法将其编译。如果要将此运算符视为前缀函数,则将其放置在正确的位置

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的。很抱歉造成混淆。我没有尝试的一件事是将(*)放在($)之前。你所做的关键洞察(一旦你做到了就很明显)是,它正在对它左边的所有东西进行操作。非常感谢有一件事我没有尝试过,那就是把(*)放在($)之前。你所做的关键洞察(一旦你做到了就很明显)是,它正在对它左边的所有东西进行操作。非常感谢