1

このコードの問題は何ですか?

addNum :: Int->Int-> Int
addNum a b = a+b

divideby :: ( Int->Int -> Int ) -> Int  ->float
divideby  f  z  =  f /z

関数を除数付きaddNumの入力として取り、答えを出力したいと思います。dividebyしたがって、divideby関数は高次関数として機能する必要があります。

このコードの問題は何ですか? 次のエラーが発生します。

*** Expression     : f / z
*** Term           : f
*** Type           : Int -> Int -> Int
*** Does not match : Int
4

3 に答える 3

6

それはまさにエラーが言うことを意味します。関数の型が

divideby :: ( Int->Int -> Int ) -> Int  ->float

つまり、最初の引数は 型の関数である必要がInt->Int -> Intあり、2 番目の入力は である必要がありInt、その後、 が生成されfloatます。当然、Haskell は関数を Int で割る方法を知りませんf / z


コメントへの応答: いいえ。それは高階関数ではありませんが、それに近いです。見てみましょう:

addNum :: Int -> Int -> Int
addNum a b = a + b

divideBy :: Int -> Int -> Int -> Int
divideBy a b c = (addNum a b) `div` c

divideByIntは、入力として3 秒を受け取り、 を生成する関数ですInt。その入力は単なるIntであるため、高階関数ではありません。ただし、の使用を入力に抽象化しaddNumて、高階関数にすることができます。addNumtype(Int -> Int -> Int)を持っているので、すでに持っている入力に加えて、それを最初の入力の型にします

divideBy :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int
divideBy f a b c = (f a b) `div` c

これは高階関数であり、正しくコンパイルされ、意味があります。:)addNumこの関数への入力として渡すことができます。

ghci> divideBy addNum 2 4 6 -- (2 + 4) / 6
1
于 2012-02-05T06:52:24.737 に答える
1

との間には違いがfloatありFloatます...前者は型変数であり、後者は具体的な型です(Double代わりにほぼ間違いなく必要です)。

これは、ダン・バートンの答えに関連しています。

于 2012-02-05T07:25:41.220 に答える
1

addNum 関数を入力として、除算係数を使用して除算関数に入力し、答えを出力したいと考えています。

まず第一に、dividebyfunction は関数で、2 つの数値を取りfzを返しますf/z。ダン バートンが言ったように、divideby関数が 2 つの値の除算を返す場合、引数としてInt関数を取得できませんInt -> Int -> Int

したがって、次のようになります。

divideby :: Int -> Int -> Float
divideby  f z  =  (fromIntegral f) / (fromIntegral z)

の結果を の最初の引数として取るように、dividebyとの重ね合わせとして何らかの関数を構築したい場合は、次のように実行できます。addNumaddNumdivideby

newFunction :: Int -> Int -> Float
newFunction a b = divideby (addNum a b) b

これは、実際には に等しいです(a+b)/b

于 2012-02-05T08:42:05.057 に答える