Haskell 创建输入列表第n个元素的列表
请容忍我,因为我是哈斯克尔的新手 我试图编写一个函数,输出: 输出中的第一个列表应与输入列表相同。这个 输出中的第二个列表应包含 输入列表等 示例:Haskell 创建输入列表第n个元素的列表,haskell,Haskell,请容忍我,因为我是哈斯克尔的新手 我试图编写一个函数,输出: 输出中的第一个列表应与输入列表相同。这个 输出中的第二个列表应包含 输入列表等 示例:func“ABCD”=[“ABCD”、“BD”、“C”、“D”] 我首先编写了一个函数来获取列表中的每个第n个元素: everyN n xs = case drop (n-1) xs of [] -> [] (z:zs) -> z : everyN n zs 现在我知道我只
func“ABCD”=[“ABCD”、“BD”、“C”、“D”]
我首先编写了一个函数来获取列表中的每个第n个元素:
everyN n xs = case drop (n-1) xs of
[] -> []
(z:zs) -> z : everyN n zs
现在我知道我只需要有一个函数,它调用这个函数,每次调用它时都会增加n
值,但我一辈子都无法思考如何编写这样一个函数,或者用什么最简洁的方式来表达它。如果可能的话,我不想使用显式递归,而是使用haskell语言函数
有人能给我指出正确的方向吗?我知道这有点站不住脚,因为@chi已经给了你这个评论——但也许作为奖励,我为你的
everyN
提供了一个替代方案:
everyN :: Int -> [a] -> [a]
everyN n xs = every n xs
where every _ [] = []
every 1 (x:xs) = x : every n xs
every m (_:xs) = every (m-1) xs
seqN :: [a] -> [[a]]
seqN xs = [ everyN n xs | n <- [1..length xs] ]
flip everyN :: [a] -> Int -> [a]
解释
有人让我解释一下:
首先看地图:map:(a->b)->[a]->[b]
-现在我们显然想要融入everyN
,而everyN
有两个参数,我们当然想将其部分应用于某些东西。正在更改的参数不是输入列表xs
,而是n
,xs
将保持不变
因此,我们当然希望将everyN
部分应用于xs
——但我们不能,因为这个参数位于错误的位置
flip
拯救:这将翻转everyN
的参数:
everyN :: Int -> [a] -> [a]
everyN n xs = every n xs
where every _ [] = []
every 1 (x:xs) = x : every n xs
every m (_:xs) = every (m-1) xs
seqN :: [a] -> [[a]]
seqN xs = [ everyN n xs | n <- [1..length xs] ]
flip everyN :: [a] -> Int -> [a]
我们可以将其部分应用于xs
并编写:
flip everyN xs :: Int -> [a]
最后,我们可以将其与map
一起使用(当然,范围是n
超过1..length xs
,因为如果我们跳转的长度超过length xs
,那么就没有什么可以选择的了),如图所示
我不知道该如何把它写成一个英语句子;) 我知道这有点站不住脚,因为@chi已经给了你这个评论——但也许作为奖励,我可以为你的
everyN
:
everyN :: Int -> [a] -> [a]
everyN n xs = every n xs
where every _ [] = []
every 1 (x:xs) = x : every n xs
every m (_:xs) = every (m-1) xs
seqN :: [a] -> [[a]]
seqN xs = [ everyN n xs | n <- [1..length xs] ]
flip everyN :: [a] -> Int -> [a]
解释
有人让我解释一下:
首先看地图:map:(a->b)->[a]->[b]
-现在我们显然想要融入everyN
,而everyN
有两个参数,我们当然想将其部分应用于某些东西。正在更改的参数不是输入列表xs
,而是n
,xs
将保持不变
因此,我们当然希望将everyN
部分应用于xs
——但我们不能,因为这个参数位于错误的位置
flip
拯救:这将翻转everyN
的参数:
everyN :: Int -> [a] -> [a]
everyN n xs = every n xs
where every _ [] = []
every 1 (x:xs) = x : every n xs
every m (_:xs) = every (m-1) xs
seqN :: [a] -> [[a]]
seqN xs = [ everyN n xs | n <- [1..length xs] ]
flip everyN :: [a] -> Int -> [a]
我们可以将其部分应用于xs
并编写:
flip everyN xs :: Int -> [a]
最后,我们可以将其与map
一起使用(当然,范围是n
超过1..length xs
,因为如果我们跳转的长度超过length xs
,那么就没有什么可以选择的了),如图所示
我不知道该如何把它写成一个英语句子;) 当然,你可以想出一个标题,简洁地概括你的问题。这个标题太笼统,无法吸引潜在的回答者。作为建议,尝试概括/改编
[everyN n“ABCDEFGHI”| n您能给我解释一下在这种情况下我可能如何使用map吗?我从未见过语法“|n@leshow-是的,它确切地说:给我一个列表([…]
)我们通过everyN n xs
生成此列表中的项目,并从1..9
中获取n
,当然你可以想出一个标题,简要地总结你的问题。这个标题太笼统了,无法吸引潜在的回答者。作为建议,尝试概括/改编[everyN n”ABCDEFGHI“| n你能解释一下我在这个场景中如何使用map吗?我从来没有见过语法”|n@leshow-是的,它说的正是:给我一个列表([..]
),在这里我们通过everyN n xs
生成这个列表的项目,我们从1..9
中取n
,你能写出什么“map(flip everyN$xs 1..length xs”“听起来像英语吗?对不起,我不明白那句话的意思。如果不使用函数应用程序($),你怎么写映射行?只需再加一对括号:map((flip everyN)xs)[1…length xs]
你不需要使用$
:(flip everyN xs)=((flip everyN)xs)==(flip everyN)xs=(flip everyN$xs)
(不,我一点也不介意你把我的评论扩展成一个答案。)谢谢lol。我想我困惑的部分是参数的数量。map接受一个函数和一个列表,everyN接受一个int和一个列表,但是我看不到:map((flip everyN)xs)[1..length xs
我觉得everyN只传递了一个列表,我看不到整数在哪里传递。哪个参数作为列表传递给map函数?你能写出什么“map(flip everyN$xs)[1..length xs]”听起来像英语吗?对不起,我不明白那句话的意思。如果不使用函数应用程序($),你怎么写映射行?只需再加一对括号:map((flip everyN)xs)[1…length xs]
你不需要使用$
:(flip everyN xs)=((flip everyN)xs)==(flip everyN)xs=(flip everyN$xs)
(不,我一点也不介意你把我的评论扩展成一个答案。)谢谢lol。我想我困惑的部分是参数的数量。map接受一个函数和一个列表,everyN接受一个int和一个列表,但是我看不到:map((flip everyN)xs)[1..length xs
我觉得everyN只传递了一个列表,我看不到整数在哪里传递。哪个参数作为列表传递给map函数?