2012-02-07 13 views
2

私はハスケルを初めて使い、次の問題があります。私は数字のリストを作成する必要があります[f1、f2、f3 ...] fi x = x^i。次に、番号リストにfiを適用する関数を作成する必要があります。例えば、私がリストlis = [4,5,6,7..]を持っていれば、出力は[4^1, 5^2,6^3, 7^4...]になります。これは私がこれまでに書かれたものです:ハスケルのリスト機能へのマッピング

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

最初の問題はpowersInt -> [Int]であることです。あなたが本当に望んでいるのは、タイプ[Int -> Int]のもので、Intを受け取り、Intのリストを返す関数ではなく、Int -> Intという関数のリストであると思います。あなたはそのようpowersを定義する場合:

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

($)はにその左側(最初)の引数を適用します。

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

ので好きですが、リスト内の対応する要素に各電源を適用するためにzipWithを使用することができますその右(第2)引数。

powers = [(^y) | y <- [1..]] 
:ここで定義されているよう powersを使用するので、同じように、あなたは任意の長さのリストを使用することができるようにしたい場合は、あなたが powers無限のリストを作りたい4に戻って、リストの長さを制限することを

注意もちろん

dave4420が指摘するように、単純な手法は、単にそれは宿題ではありません

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

または 'zipWith(^)list [1 ..]'です。 – dave4420

+0

Heh - それは私がOPのデザインを模倣するために得るものです – Retief

3

お客様のmatchは別の名前で標準機能mapです。代わりにzipWithを使用する必要があります(これは、2つのリストを並べてマッピングすると考えることができます)。

この宿題はありますか?

+0

全く使用しないことです。私はhaskellのexcercisesを探していました。私はそれを見つけました。私はhaskellを学びたいから試してみることができたと思っていました。私はジップを試みます。ありがとうございます。 – Newbie

1

現在、入力値ごとにリストを作成しています。あなたはmatch pow [1, 2, 3] 1としてこれを呼び出すことができ、その後

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

:あなたがする必要がどのような は、再帰的にこのような各入力値のための適切な の電力を、計算です。 これは、zipWithを使用し、目的の関数(pow)、入力リスト([1, 2, 3])、指数リスト(無限リストから無限リスト)を引数として提供するのと同じです。

関連する問題