Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 如何将可遍历函数应用于一个值_List_Function_Haskell_Apply_Traversable - Fatal编程技术网

List 如何将可遍历函数应用于一个值

List 如何将可遍历函数应用于一个值,list,function,haskell,apply,traversable,List,Function,Haskell,Apply,Traversable,如果我想要像这样的东西,我应该用什么 [a->b] -> a -> [b] 基本上我有一个函数列表,所有函数都接受一个值a,并返回b。我想将所有这些应用于一个a,并得到结果[b] 我应该用哪一个 谢谢您不需要可遍历,只需要函子: swingMap f x=fmap($x)f 另请参见(这相当于swing fmap) 或者,如果您使用的是,您可以通过使用(避免为作业定义自定义函数)获得这两个答案的最佳结果(只有Functor,而不是可遍历的),而不需要可遍历的,只需Func

如果我想要像这样的东西,我应该用什么

[a->b] -> a -> [b]
基本上我有一个函数列表,所有函数都接受一个值
a
,并返回
b
。我想将所有这些应用于一个
a
,并得到结果
[b]

我应该用哪一个


谢谢

您不需要
可遍历
,只需要
函子

swingMap f x=fmap($x)f
另请参见(这相当于
swing fmap



或者,如果您使用的是,您可以通过使用(避免为作业定义自定义函数)获得这两个答案的最佳结果(只有
Functor
,而不是
可遍历的
),而不需要
可遍历的
,只需
Functor

swingMap f x=fmap($x)f
另请参见(这相当于
swing fmap



或者,如果您使用的是,您可以通过使用来获得这两个答案的最佳效果(只有
函子而不是
可遍历的
)和(避免为作业定义自定义函数)。

您可以使用
序列
,专用于
)单子。通过这种方式,您可以避免为作业定义自定义函数——它已经存在了

> :t sequence
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
> :t sequence :: [a->b] -> a -> [b]
sequence :: [a->b] -> a -> [b] :: [a -> b] -> a -> [b]
> sequence [id,(10+),(10-)] 3
[3,13,7]

sequenceA
traverse id
,两者相同,也可以工作)

您可以使用
序列
,专用于
(>)a
单子。通过这种方式,您可以避免为作业定义自定义函数——它已经存在了

> :t sequence
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
> :t sequence :: [a->b] -> a -> [b]
sequence :: [a->b] -> a -> [b] :: [a -> b] -> a -> [b]
> sequence [id,(10+),(10-)] 3
[3,13,7]

sequenceA
traverse id
,两者相同,也可以工作)

当函数出现在数据类型中时,是时候记住应用程序了,因为它就是这样。一个人可能很容易像这样做这项工作

appList :: [a->b] -> a -> [b]
appList fs x = fs <*> pure x

λ> appList [(+1), (*2), subtract 3] 5
[6,10,2]
appList::[a->b]->a->[b]
appList fs x=fs pure x
λ> 应用程序列表[(+1),(*2),减去3]5
[6,10,2]

当函数出现在数据类型中时,是时候记住应用程序了,因为它就是这样。一个人可能很容易像这样做这项工作

appList :: [a->b] -> a -> [b]
appList fs x = fs <*> pure x

λ> appList [(+1), (*2), subtract 3] 5
[6,10,2]
appList::[a->b]->a->[b]
appList fs x=fs pure x
λ> 应用程序列表[(+1),(*2),减去3]5
[6,10,2]


正如另一个答案所显示的那样,这看起来绝对是矫枉过正。虽然对此进行了更多思考,但我找到了一个结合了两种方法优点的解决方案(现在编辑到我的答案中)。@dfeur我不知道在这种情况下什么是矫枉过正。OP只要求函数列表中的特定函数。我的答案和Joseph的(编辑后)都使用通用库函数来完成这项工作。也许是因为它是一般性的,所以杀伤力太大了?使用自定义函数更好吗?我不确定。请注意,现在
sequence
在范围内,没有导入任何内容,因此要求程序员理解它并非完全不合理。@chi我认为dfeuer的观点是
Traversable
约束过于严格。@dfeuer
fmap
明显简单,但仅此一点并不能解决问题;我们需要的是
\fx->fmap($x)f
,在我看来,这并不简单。我认为这里没有一个完全客观的“更简单”的概念。对我来说,我们需要将
[a->b]
转换为
a->[b]
,即通勤
[]
a->
,这两种
顺序
/
分配
做得既好又简单。当然,其他人可能不同意:-)正如另一个答案所显示的那样,这看起来绝对是过度杀戮。虽然对此进行了更多的思考,但我找到了一个结合了两种方法优点的解决方案(现在编辑到我的答案中)。@dfeur我不知道在这种情况下什么是过度杀戮。OP只要求函数列表中的特定函数。我的答案和Joseph的(编辑后)都使用通用库函数来完成这项工作。也许是因为它是一般性的,所以杀伤力太大了?使用自定义函数更好吗?我不确定。请注意,现在
sequence
在范围内,没有导入任何内容,因此要求程序员理解它并非完全不合理。@chi我认为dfeuer的观点是
Traversable
约束过于严格。@dfeuer
fmap
明显简单,但仅此一点并不能解决问题;我们需要的是
\fx->fmap($x)f
,在我看来,这并不简单。我认为这里没有一个完全客观的“更简单”的概念。对我来说,我们需要将
[a->b]
转换为
a->[b]
,即通勤
[]
a->
,这两种
顺序
/
分配
做得既好又简单。当然,其他人可能不同意:-)lens(和relude)的
也可用于此目的,并内置在公共库中。@MikaelF它与我的
swingMap
相同,但如果您使用的是第三方库,
distribute
比它更通用。它们完全相同,而且只需要一个函子。我只是想把它们命名为旁注。@Mikael如果它们不一样的话。有很多
分布式
实例,而且
分布式
对它们都有效,但是
??
只对函数有效。
fmap($x)t
分布式Tx
更容易理解。噢<来自lens(和relude)的code>??
也可用于此目的,并内置在公共库中。@MikaelF它与我的
swingMap
相同,但如果您使用的是第三方库,
distribute
比它更通用。它们完全相同,而且只需要一个函子。我只是想把它们命名为旁注。@Mikael如果它们不一样的话。有很多
分布式
实例,而且
分布式
对它们都有效,但是
??
只对函数有效。
fmap($x)t
分布式Tx
更容易理解。噢!交换法可以(国际海事组织也应该)适用于那里。@Joseph Sible恢复Monica我不得不去寻找但不能