Haskell映射到的索引列表!!操作人员

Haskell映射到的索引列表!!操作人员,haskell,Haskell,当在ghci解析器中检查map(!!)[1,2]的类型时,我得到的结果是:Num[a]=>[Int->a]。这与以下事实有关:(!!)的第一个参数应该是一个列表。但是,我想在操作符中输入一个索引列表,以获得这种类型的[a]->[a] 编辑 在@dfeuer建议将其包装到另一个函数中之后,我认为也可以使用flipthen。检查的类型(映射(翻转(!!))[1,2])给出类型[[c]->c],这就是我要找的。我猜你想要的 pickAndChoose::[Int]->[a]->[a] 选择索引值 =映

当在ghci解析器中检查
map(!!)[1,2]
的类型时,我得到的结果是:
Num[a]=>[Int->a]
。这与以下事实有关:
(!!)
的第一个参数应该是一个列表。但是,我想在操作符中输入一个索引列表,以获得这种类型的
[a]->[a]

编辑 在@dfeuer建议将其包装到另一个函数中之后,我认为也可以使用
flip
then。检查
的类型(映射(翻转(!!))[1,2])
给出类型
[[c]->c]
,这就是我要找的。

我猜你想要的

pickAndChoose::[Int]->[a]->[a]
选择索引值
=映射(值!!)索引
自从<代码>在它检索的元素的位置上花费线性时间,如果使用许多索引,这将是非常低效的,尤其是当它们相对较大时。您可能希望考虑使用诸如<代码>数据>序列>代码>而不是列表。

< p>我猜您想要

pickAndChoose::[Int]->[a]->[a]
选择索引值
=映射(值!!)索引

自从<代码>在它检索的元素的位置上花费线性时间,如果使用许多索引,这将是非常低效的,尤其是当它们相对较大时。你可能想考虑使用诸如<代码>数据>序列>代码>而不是列表。

如果你有一个索引列表,并且你想要一个从输入列表中选择这些索引的函数,那么你希望<代码> map 重复索引,而不是你现在正在做的输入:

getIndices :: [Int] -> [a] -> [a]
getIndices indices input = map (input !!) indices
如果您想使用索引的内联列表以更紧凑的方式编写此文件,可以减少
输入
参数,如下所示:

\ input -> map (input !!) [1, 2]
\ input -> [1, 2] <&> (input !!)  -- Data.Functor.(<&>) = flip (<$>)
\ input -> [1, 2] <&> (!!) input
\ input -> (([1, 2] <&>) . (!!)) input

([1, 2] <&>) . (!!)
这可以写成:

> oneTwo = flap (index <$> [1, 2])
> oneTwo "beans"
"ea"

> index <$> [1, 2] ?? "bears"
"ea"

如果您有一个索引列表,并且需要一个从输入列表中选择这些索引的函数,那么您希望
映射
在索引上迭代,而不是像您当前所做的那样在输入上迭代:

getIndices :: [Int] -> [a] -> [a]
getIndices indices input = map (input !!) indices
如果您想使用索引的内联列表以更紧凑的方式编写此文件,可以减少
输入
参数,如下所示:

\ input -> map (input !!) [1, 2]
\ input -> [1, 2] <&> (input !!)  -- Data.Functor.(<&>) = flip (<$>)
\ input -> [1, 2] <&> (!!) input
\ input -> (([1, 2] <&>) . (!!)) input

([1, 2] <&>) . (!!)
这可以写成:

> oneTwo = flap (index <$> [1, 2])
> oneTwo "beans"
"ea"

> index <$> [1, 2] ?? "bears"
"ea"

所以你想要
map(!!)[1,2]
,除了相同的列表被传递到每个元素之外?
[a]->[a]
真的没有意义。您想要一个包装列表、获取一组索引并返回相应值的函数吗
(someList!!)
将具有类型
Int->a
,因此
map(someList!!):[Int]->[a]
。然后
map(someList!!)[1,2]==[someList!!1,someList!!2][a]->[a]\x->map(x!!)[1,2]
具有该类型。但是,如果输入应该是索引列表,则不会。虽然可能
map(!![1,2]),但某些列表
是所需的结果。因此,您想要
map(!!)[1,2]
,除了将相同的列表传递给每个元素之外?
[a]->[a]
没有真正意义。您想要一个包装列表、获取一组索引并返回相应值的函数吗
(someList!!)
将具有类型
Int->a
,因此
map(someList!!):[Int]->[a]
。然后
map(someList!!)[1,2]==[someList!!1,someList!!2][a]->[a]\x->map(x!!)[1,2]
具有该类型。但是,如果输入应该是索引列表,则不会。虽然可能
map(!![1,2])someList
是期望的结果。因此,这是另一个修复输入参数顺序的函数。flip也可以这样做吗?我想这是可行的,我检查了它的类型:
(map(flip(!!))[1,2])
,它给出了
[[c]->c]
,所以这是另一个修复输入参数顺序的函数。flip也可以这样做吗?我想可以,我检查了它的类型:
(map(flip(!!))[1,2])
,它给出了
[[c]->c]
你能检查我的编辑吗。这是正确的还是我仍然错了?我还没有达到使用Data.Functor的水平,所以我会在我使用Data.Functor时回到这里。@GertjanBrouwer:
map(flip(!!))[1,2]
生成函数列表;第一个函数选择其参数的索引1,第二个函数选择索引2。您可以将它们应用到同一个列表中,如
[f“beans”| f您可以检查我的编辑吗。这是否现在确实正确,还是我仍然错了?我还没有使用Data.Functor,所以我将在使用时返回到这个级别。@GertjanBrouwer:
映射(翻转(!!))[1,2]
生成一个函数列表;第一个函数选择其参数的索引1,第二个选择索引2。您可以将所有函数应用于同一个列表,如
[f“beans”| f