我开始学习 Haskell 并找到了一个很好的练习。如下:
grouping: Int -> [Student]->[(Team, Student)]
grouping teamNumber = zip ys
where ...
因此,练习希望我尝试填补其余部分。该函数应执行以下操作:示例:grouping 2 ['Mark','Hanna','Robert','Mike','Jimmy'] = [(1,'Mark'),(2,'Hanna'),(1,'Robert'),(2,'Mike'),(1,'Jimmy')]
。
所以,我们正在组建由两个学生组成的团队,最后一个学生“吉米”没有队友。
然后,我还查找了预定义函数的zip
作用。它获取两个列表参数并将列表的每个元素连接到一个元组以构建一个元组列表。
我的想法:1)我尝试构建两个函数“grab”和“infinite”。他们看起来如下:
grap :: Int -> [a] -> [a]
grab _ [] = []
grab n (x:xs) = if n <= 0 then [] else x : grab (n-1) xs
infinite :: Num a => a -> [a]
infinite x = x : infinite(x+1)
所以,他们所做的是:infinite
我想创建一个无限列表。并且grap
应该采取n
其中的元素。例子grap 2 (infinite 1) = [1,2]
。
我在where -declaration 的第一行中使用这两个来实现上面的给定功能。所以我有:
grouping: Int -> [Student]->[(Team, Student)]
grouping teamNumber = zip ys
where
xs = grap teamNumber (infinite 1)
所以,xs
现在是我的第一个列表zip
,尤其是整数列表。
但现在我的问题是:zip
作为预定义函数还需要第二个列表,尤其是学生姓名的列表,但在给定的函数中,他们只给 zip 一个参数,即ys
作为列表。我怎么能理解呢?