Как реализовать функцию take в Haskell, используя takeWhile? - PullRequest
0 голосов
/ 14 февраля 2020

Итак, на моем экзамене мне пришлось реализовать функцию take в Haskell, используя takeWhile.

Как я могу это сделать?

Каково будет условие в takeWhile, чтобы оно брало только необходимое количество элементов из списка?

Поскольку в моем понимании в takeWhile условие относится к элементам списка, а не к их числу.

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

, насколько я понимаю, в takeWhile условие относится к элементам списка, а не к их числу

Да! За исключением, может быть, возможно, мы могли бы каким-то образом заставить каждый элемент отражать количество своих предыдущих элементов в списке, то есть его index в списке.

Таким образом, нам нужно преобразовать наш аргумент список

[ <b>a</b>, <b>b</b>, <b>c</b>, .... ]

в новый, модифицированный, содержащий расширенную информацию в своих элементах, например,

[(<b>a</b>, <i>what?</i>), (<b>b</b>, <i>goes?</i>), (<b>c</b>, <i>here?</i>), .... ]

и затем ремесло какой-то предикат для этих пар делать то, что мы хотим; затем восстановите исходные элементы из пар, следуя парадигме decorate - transform - undecorate .

Если вы не знакомы со встроенными функциями более высокого порядка, которые могут sh эти задачи, вы можете сами их кодировать с помощью рекурсии. Или используйте списочные представления.

0 голосов
/ 15 февраля 2020

СДЕЛАНО !!!

Большое спасибо за помощь всем!

Я знаю, что это могло бы работать лучше, но сейчас это решение сработало.

index Функция:

index :: [a] -> [(Int, a)]
index [] = []
index x = index2 x 1

index2 :: [a] -> Int -> [(Int, a)]
index2 [] _ = []
index2 (x:xs) i = (i, x) : index2 xs (i+1)

deindex функция:

deindex :: [(Int, a)] -> [a]
deindex [] = []
deindex ((i,x):xs) = x : deindex xs

myTake функция с использованием takeWhile:

myTake :: Int -> [a] -> [a]
myTake k _
    | k <= 0 = []
myTake _ [] = []
myTake n list = deindex (takeWhile (\ (x,y) -> x<=n) (index list))
...