それはまさにエラーが言うことを意味します。関数の型が
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
divideBy
Int
は、入力として3 秒を受け取り、 を生成する関数ですInt
。その入力は単なるInt
であるため、高階関数ではありません。ただし、の使用を入力に抽象化しaddNum
て、高階関数にすることができます。addNum
type(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