Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Haskell 创建输入列表第n个元素的列表_Haskell - Fatal编程技术网

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函数?