Я начал изучать 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) Я пытаюсь построить две функции "захват" и "бесконечность". Они выглядят следующим образом:
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]
. - person Will Ness   schedule 13.05.2014