2017-12-07 12 views
2

GHCiでapplyToIntegersを使用するmultiplyList関数を実行しています。私はそれが2でリストを掛けたかった。以下は私が試したものと私が得たエラーです。その下に、便宜上、リストIIからの抜粋があります。multiplyListはどのように動作させるのですか? Haskell ref:https://en.wikibooks.org/wiki/Haskell/Lists_II

リストIIのコードはOKです。私の問題は次のとおりです。コード内のどこに乗数を入れますか?

applyToIntegersを単独で使用することはできますが、mapを使用して複製することができます。私はmultiplyListからapplyToIntgersに接続できません。

これは、私が先月前に聞いたことがなかったHaskellを学んでいる私の最初の投稿です。Haskellの優れたウィキブックスの中から、私は最も美しい高水準プログラミング言語であると言わなければなりませんこれまでに遭遇した。

*Main> :l ods.hs 
[1 of 1] Compiling Main    (ods.hs, interpreted) 

ods.hs:15:35: error: 
    • Couldn't match expected type ‘Integer -> Integer’ 
        with actual type ‘Integer’ 
    • Possible cause: ‘2 *’ is applied to too many arguments 
     In the first argument of ‘applyToIntegers’, namely ‘((2 *) m)’ 
     In the expression: applyToIntegers ((2 *) m) 
     In an equation for ‘multiplyList’: 
     multiplyList m = applyToIntegers ((2 *) m) 
Failed, modules loaded: none. 
Prelude> 


https://en.wikibooks.org/w/index.php?title=Haskell/Lists_II&oldid=3242682は、我々は、他の適切な関数を取り、の要素に
与えられた関数を適用する機能が必要になります。

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer] 
applyToIntegers _ [] = [] 
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns 
-- E.g., applyToIntegers (2*) [1..5] = [2,4,6,8,10], also 
-– map (2*) [1..5] = [2,4,6,8,10] 

-- Unable to come up with a working example: 
multiplyList :: Integer -> [Integer] -> [Integer] 
--multiplyList m = applyToIntegers ((*) m) -- Compiles OK. 
-- If I try: 
multiplyList m = applyToIntegers ((2*) m) 

私は次の取得しますリスト:

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer] 
applyToIntegers _ [] = [] 
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns 

applyToIntegersを使用すると、Integer -> Integer関数を使用して、 整数を整数の要素の要素に適用できます。私たちは、このようにmultiplyListを再定義するためにこの一般 機能を使用することができます:

multiplyList :: Integer -> [Integer] -> [Integer] 
multiplyList m = applyToIntegers ((*) m)
1つの以上の引数を(取るために準備ができている新しい 関数を作成するために、単一の最初の引数で (*)機能を使用しています

れ、このユースケースでは、 与えられたリストの数字から来る)。

+2

あなたの質問に見えるかもしれませんがそのURLをタイトルから削除して実際のクリック可能なリンクとして質問の本文に入れた方が少し良いです。 – dividebyzero

+0

あなたはそこに答えを持っています。エラー状態と同じように、あまりにも多くの引数に '(*)'を適用しました。 'm'を' 2'に置き換えてください。 – AJFarmar

答えて

1

multiplyListの型シグネチャ:

Integer -> [Integer] -> [Integer]

は、整数、整数のリストを取り、そしてそれは整数のリストを返すと言います。

したがって、multiplyListはリストを乗算するためのパラメータをとることを意図しています。

我々はmultiplyListの定義を使用して、2を掛けたい場合:

multiplyList m = applyToIntegers ((*) m)

我々だけmultiplyList 2 [1..3] == [2,4,6]を呼び出すことができます。

それは

multiplyList n xs = applyToIntegers (\x -> x * n) xsに、我々は単に定義場合multiplyListがどのように機能するかを示すために少し簡単です。

これは以前の定義とまったく同じです。わかりやすい方法で書かれています。

これはmultiplyListは整数n、リストxsをとり、nによって乗算関数を渡し、そしてapplyToIntegersにリストxsと言います。

applyToIntegersは、リスト内のすべての項目にその掛け算関数を適用します。

結論として、multiplyListには、掛ける値を指定するだけです。あなたが好きなら私たちは、別の関数にこれを分けることができます:私たちは、その後、任意のリストにこの機能を使用することができ、その値が乗算されますイータはmultiplyListByTwo = multiplyList 2

に減少させることができる

multiplyListByTwo xs = multiplyList 2 xs

multiplyListByTwo [1..3]は、[2,4,6]となります。

+1

あなたの答えがまったく簡単なので、私の顔には大きな笑みを浮かべています!答えたすべての人に感謝します。 – Joey

0

これはすべてカレーに関するものです。 (*)は、署名がInteger -> Integer -> Integerの関数です。 ((*) 2)は、Integer -> Integerという名前の関数を生成します。これは、2番目の数値に適用して製品を得ることができます。この関数は、applyToIntegersに提供されて、リストを引数として取る関数multiplyListを生成します。 2つの引数、数字(例えば2)であるm、およびリストを取る関数としてmultiplyListを見ることもできます。

コンパイラのメッセージはかなり現実的ですが、applyToIntegersは関数((*)2)を期待していますが、数値(2 * m)を指定しています。あなただけの本の章では、前の例のように

multiplyList 2 [1,2,3]

のようにそれを呼び出す必要があります。これと同じ機能は、単に引数が暗黙的になり、別の方法で、「高次」スタイルに書き換えられている...

+0

それは表示されませんが、私はこの答えのための "好き"を登録しました。 HaskellがmultiplyListの方程式の左辺から不足している整数をどのように得ることができるかを頭に入れておくと、multiplyListの引数として、ただ1つの引数、つまり "m"があるかのように見えます。 – Joey

+0

Haskellのすべての関数は実際には1つの引数をとり、別の引数をとる可能性のある別の関数を返す可能性があります。だから、 'multiplyList'とは、一つの数字をとり、リストを取る関数を返す関数か、数字とリストを取る関数のいずれかと考えることができます。部分的なアプリケーションはハスケルのパンとバターです。 – dividebyzero

1

のは、関数の定義になりまし

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer] 
multiplyList :: Integer -> [Integer] -> [Integer] 

の両方での戻り値の型を見てみましょう関数はいくつか[Integer]です。

multiplyList m = applyToIntegers ((2*) m) 

右から左から順に、applyToIntegersには2つの引数が必要ですが、1が指定されています。 inside()の式が計算され、結果として返されます。この時点で

multiplyList m = applyToIntegers (2*) m 

我々は今、タイプMは[整数]とmultiplyListが

multiplyList ::[Integer] -> [Integer] 

結果multiplyList

の定義の書き換え1つの引数ではありません2必要である:

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer] 
applyToIntegers _ [] = [] 
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns 

multiplyList :: [Integer] -> [Integer] 
multiplyList m = applyToIntegers ((2*) m) 
関連する問題