【发布时间】:2014-05-12 17:11:41
【问题描述】:
我开始学习 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')]。
所以,我们正在组建由两名学生组成的团队,而最后一名学生“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 声明的第一行中使用这两个来实现上面的给定功能。 所以,我有:
grouping: Int -> [Student]->[(Team, Student)]
grouping teamNumber = zip ys
where
xs = grap teamNumber (infinite 1)
所以,xs 现在是我的第一个 zip 列表,尤其是整数列表。
但现在我的问题:zip 作为预定义函数还需要第二个列表,尤其是学生姓名列表,但在给定函数中,他们只给 zip 一个参数,即 ys 作为列表.我怎么理解?
【问题讨论】:
-
在您的
grouping中,您省略了ys = cycle xs。另外,infinite==enumFrom、infinite 1==[1..]、grab==take、take n [1..]==[1..n]。
标签: list haskell currying partial-application