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