7

私にはやるべき宿題が少しあり、Haskellの完全な初心者です。私が問題を抱えているのは、整数xと整数のリストがリスト内の各要素に適用(x-y)*(x-y)され、入力リストの各要素である新しいリストを出力する関数を作成するyことです。

この関数を使用する必要があるという非常に大まかな考えがありmapますが、どのように実行すればよいかわかりません。

私はリスト内の各要素を二乗する例を見ていて、それがどのように機能するかを理解していますが、現在の要素である(x-y)*(x-y)とどのように実装するかはy完全に私を困惑させます。

squares :: [Int] -> [Int]
squares (x:xs) = x * x : squares xs
squares [] = []

私が設定した正確な質問は、

rela引数として整数xと整数のリストをとる関数を記述します。同様のリストを返しますが、各要素が次のyように置き換えられています(x-y)*(x-y)

Main> rela 2 [3,5,7]
[1,9,25]

何冊かの本を読んだ後、なんとか機能させることができましたが、私が作成したコードはリストの最初の要素を見逃しています。理由は何ですか?

equation1 :: Int -> Int -> Int
equation1 x y = (x-y)*(x-y)
rela :: Int -> [Int] -> [Int]
rela x [] =[]
rela x (y:ys) = [ equation1 x y | y <- ys ]
4

4 に答える 4

10

ラムダ関数を理解していますか?

map (\val -> the function) xs

必要なものです。

カリー化はさらに優れていますが、それほど単純ではありません。

編集:

より概念的な...

mapは、関数を適用してリストを繰り返します。

map (+ 3) xs

上記のカリー化技術を使用しています。あなたもできます:

map (\x -> x + 3) xs

同じことを達成するために。

于 2012-04-14T21:53:46.350 に答える
10

まず第一に、あなたはおそらくあなたが望むことをする別の関数を作成するべきです。

例えば

f x y = (x-y)*(x-y)

これで、Haskellで複数のパラメーターを使用して関数を作成するたびに、実際には関数が「カレー」されます。つまり、最初の引数を適用すると、新しい関数が取得されます。

したがって、これを行うことで新しい関数を取得できます

g = f 5

f 5は実際には関数です

また、「g」に数値を適用すると、xは常に「5」になります

したがって、「x」と「y」の2つのパラメーターを取り、(x-y)*(x-y)yが現在の要素であるリストに適用する関数を作成する場合は、次のようにする必要があります。

f x y = (x-y)*(x-y)
squareDifference x = map (f x) [1,2,3,4]

電話squareDifference 5またはその他の番号を引数として使用できます

より一般的なバージョンでは、リストを渡すこともできます

squareDifference x xs = map (f x) xs

あなたがすることによってあなたが呼ぶだろうsquareDifference 3 [1,2,3]

于 2012-04-14T19:26:01.863 に答える
2

簡単な例:

rela :: Int -> [Int] -> [Int]
rela x = map (\y -> (x-y)*(x-y))

それとも、何か変質したいですか?-)Applicativeを使用しています:

import Control.Applicative
rela :: Int -> [Int] -> [Int]
rela x = map $ (*) <$> (x-) <*> (x-)
于 2012-04-17T03:36:20.830 に答える
0

こんにちは私はあなたがこれを意味すると思います:

Prelude> let rela n = map (\ x -> (x - n)^2)
Prelude> rela 2  [3,5,7] 
[1,9,25]
于 2016-01-09T12:11:06.220 に答える