Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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_Lambda_Pointfree - Fatal编程技术网

Haskell:映射函数应用程序

Haskell:映射函数应用程序,haskell,lambda,pointfree,Haskell,Lambda,Pointfree,我在Haskell中进行的一些计算会产生一个函数列表,这些函数将Float映射到Float。我想对所有这些函数应用一个参数,如下所示: --x::Float --函数::[Float->Float] 映射(\f->f x)函数 有没有一种方法可以在不使用一次性lambda函数的情况下做到这一点?我已经搜索了我认为签名应该是什么([a->b]->a->[b]),但运气不好。您可以使用$运算符,这只是函数应用程序: map ($ x) functions (这假定x在表达式的范围内。) Hoog

我在Haskell中进行的一些计算会产生一个函数列表,这些函数将
Float
映射到
Float
。我想对所有这些函数应用一个参数,如下所示:

--x::Float
--函数::[Float->Float]
映射(\f->f x)函数

有没有一种方法可以在不使用一次性lambda函数的情况下做到这一点?我已经搜索了我认为签名应该是什么(
[a->b]->a->[b]
),但运气不好。

您可以使用
$
运算符,这只是函数应用程序:

map ($ x) functions
(这假定
x
在表达式的范围内。)

Hoogle只能找到函数,不能找到任意表达式。由于您使用的是
map
,因此您希望搜索类似
(a->b)->a->b的函数,而不是任何涉及列表的函数。给定一个普通函数,将其传递给map会使其作用于列表。

函数纯x
应该这样做。首先导入模块

也考虑如下:

Prelude Control.Applicative> [(1+),(2+)] <*> pure 4
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4]
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> [(+)] <*> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> (+) <$> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> ZipList [4,5]
[5,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> pure 4
[5,6]
Prelude Control.Applicative>[(1+,(2+)]pure 4
[5,6]
前奏曲控制。应用>[(1+,(2+)][4]
[5,6]
前奏曲控制。应用>[(1+,(2+)][4,5]
[5,6,6,7]
前奏曲控制。应用>[(+)][1,2][4,5]
[5,6,6,7]
前奏曲控制.Applicative>(+)[1,2][4,5]
[5,6,6,7]
前奏曲控件.Applicative>getZipList$ZipList[(1+,(2+)]ZipList[4,5]
[5,7]
前奏曲控件.Applicative>getZipList$ZipList[(1+,(2+)]pure 4
[5,6]

只是
fmap
的同义词<代码>
根据特定的语义,将左侧应用程序函子中“携带”的内容应用于右侧的内容。对于裸列表,语义与list monad相同—尽可能组合—从左侧将每个函数应用于右侧的每个对象,并且
pure x=[x]
。对于标记为
ZipList
s的列表(即
newtype
d),语义是“zippery”应用程序,即一对一和
pure x=ZipList$repeat x

是的,我想我对签名有点困惑。谢谢我理解
$
如何定义优先级,但在这种情况下它是如何工作的?操作符的定义非常简单:
f$x=fx
。所以它实际上只是一个函数应用程序,作为一个操作符。当你部分应用它时,你会得到相当于
\f->f$x
;使用上面的定义,这就得到了
\f->fx
,这正是您所拥有的。据我所知,
map fxs
xs
中的每个
x
。所以在我看来,它就像是
$fx
,因此我感到困惑!您对地图的理解是正确的。但是,您可能会被运算符部分弄糊涂。在Haskell中,可以通过将参数传递给任意一方来部分应用运算符。所以你可以写
(1+)
,这是函数
\x->1+x
,但你也可以写
(+1)
,这是函数
\x->x+1
。在本例中,除了使用
$
操作符之外,我完全是在这样做的。对不起,在我上面的评论中,我的意思是它看起来像
$xf
。哪一个从左边传递参数
x
?请看一个提示,有一个名为
pointfree
cabal install pointfree
)的程序可以自动完成这些缩减。e、 g.
map(\f->fx)fs
根据需要变成
map($x)fs
。这些函数实际上是为应用程序函子而不是单子定义的。应用程序更一般——所有的单子都是应用程序,但不是相反。哈哈,我还处在我认为Haskell中奇怪的东西都是单子的阶段!我会做一些研究-谢谢你的提示。