2012-02-07 2 views
2

Я новичок в Haskell, и у меня есть следующая проблема. Мне нужно создать список чисел [f1, f2, f3 ...] где fi x = x^i. Затем мне нужно создать функцию, которая применяет fi к списку чисел. Например, если у меня есть список lis = [4,5,6,7..], выход будет [4^1, 5^2,6^3, 7^4...]. Это то, что я написал до сих пор:Функция отображения Haskell в список

powers x= [x^y |y<-[1,2,3,4]] 

list = [1,2,3,4]

match :: (x -> xs) -> [x] -> [xs] 
match f [] = [] 
match f (x:xs) = (f x) : (match f xs) 

Так что, если я ставлю список = [1,2,3] выход [1,1,1,1] [2,4,8,16], [3,9,27,81] вместо [1,4,27]

Не могли бы вы рассказать мне, что не так, и указать мне в правильном направлении?

ответ

6

Первая проблема заключается в том, что powers имеет тип Int -> [Int]. То, что вы действительно хотите, я думаю, что-то типа [Int -> Int] - список функций Int -> Int вместо функции, которая принимает Int и возвращает список Int. Если определить powers так:

powers = [(^y) | y <- [1..4]] 

вы можете использовать zipWith применять каждый мощности к соответствующему элементу в списке, например, так:

zipWith ($) powers [1,2,3] -- returns [1,4,27] 

($) применяет левый (первый) аргумент его правый (второй) аргумент.

Обратите внимание, что с помощью powers, как определено здесь будет ограничивать длину возвращаемого списка 4. Если вы хотите, чтобы иметь возможность использовать произвольные списки длины, вы хотите сделать powers бесконечный список, например, так:

powers = [(^y) | y <- [1..]] 

конечно, как dave4420 указывает, более простой метод заключается просто в использовании

zipWith (^) [1,2,3] [1..] -- returns [1,4,27] 
+3

Или 'zipWith (^) list [1 ..]'. – dave4420

+0

Хех - вот что я получаю за имитацию дизайна OP – Retief

3

Ваш match является стандартной функцией map другим именем. Вместо этого вам нужно использовать zipWith (что вы можете представить как сопоставление по двум спискам бок о бок).

Это домашнее задание?

+0

нет, это не домашнее задание. Я искал упражнения в haskell, и я нашел его, и я подумал, что могу попробовать, так как я пытаюсь изучить haskell. я попробую zipWith спасибо. – Newbie

1

В настоящее время вы создаете список для каждого входного значения. Что вам нужно сделать, это рекурсивно вычислить соответствующий мощности для каждого входного значения, например:

match f [] = [] 
match f (x:xs) y = (f x y) : (match f xs y+1) 

Затем, вы можете назвать это как match pow [1, 2, 3] 1. Это эквивалентно использованию zipWith и предоставляет желаемую функцию (pow), ваш список ввода ([1, 2, 3]) и список экспонентов (от ленивого до бесконечности) в качестве аргументов.

Смежные вопросы