gpt4 book ai didi

list - 重复调用一个函数 : Haskell

转载 作者:行者123 更新时间:2023-12-04 04:50:40 25 4
gpt4 key购买 nike

基本上,我想创建一个函数,它接受一个整数列表和另一个列表(这个列表可以是任何类型),并以整数列表指定的间隔生成另一个列表,其中包含“其他列表”中的元素.如果我输入:

ixs [2,3,1] [3,2,1]
[2,1,3]



到目前为止,我有:
ix :: Int -> [a] -> a
ix a [] = error "Empty list"
ix 1 (x:xs) = x
ix a (x:xs) = ix (a-1) xs

ixs :: [Int] -> [a] -> [a]
ixs [] _ = []
ixs _ [] = []
ixs (x:xs) (y) = ix x y: []

使用此代码,我只能得到一个返回值,如下所示:

ixs [1,2] [2,1]
[2]



如何调用 ix(x:xs) 上重复运行以便它返回我想要的所有值?

编辑:我想在不使用任何标准前奏函数的情况下做到这一点。我只想使用递归。

最佳答案

这(几乎)是第一个列表在第二个列表上的索引(“获取值”)的映射

import Data.List ((!!))
-- (!!) :: [a] -> Int -> a

ixs :: [Int] -> [b] -> [b]
ixs ary ixes = map (ary !!) ixes

但是,当您通过 (3 mod 3 = 0) 索引 3 元素列表时,您也有环绕。 ,所以我们应该只映射 mod在索引之上
ixs ary ixes = map (ary !!) (map (`mod` length ary) ixes)

然后我们可以简化为“无意义的风格”
ixs ary = map (ary !!) . map (`mod` length ary)

它很好地读作“映射索引以数组长度为模,然后将数组索引映射到结果索引上”。它给出了正确的结果
> ixs [2,3,1] [3,2,1] 
[2,1,3]

分解前奏功能和 Data.List函数,我们有
(!!) :: [b] -> Int -> b
(x:_) !! 0 = x
(_:xs) !! n
| n > 0 = xs !! (n-1)
| otherwise = error "List.(!!): negative argument."
_ !! _ = error "List.(!!): index too large."


map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

关于list - 重复调用一个函数 : Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17494120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com