1

Haskell初心者です。この表現のどこが間違っていますか?:

Prelude> let { f op [] = [] ; f op (h:t) = op h : f op t }
Prelude> f (+) []
<interactive>:337:1:
    No instance for (Show (t0 -> t0))
      arising from a use of `print'
    Possible fix: add an instance declaration for (Show (t0 -> t0))
    In a stmt of an interactive GHCi command: print it

ご支援ありがとうございます。

4

4 に答える 4

2

関数(+)にはタイプが(+) :: Num a => a -> a -> aあり、関数fにはタイプがありf :: (t -> a) -> [t] -> [a]ます。

f1つの引数の関数を期待します。

f (+1) []正しくなります

于 2012-07-06T08:09:32.760 に答える
2

あなたの関数は次のタイプであると推測されます: (x -> y) -> [x] -> [y].

(+)タイプがありNum a => a -> a -> aます。これは、 beとbe(x -> y)を取る場合、型のインスタンスになる可能性があるため、すべて問題ありません。したがって、 の空のリストはtype でなければならず、戻り値の型は(もちろん、これらすべてに同じ制約があります) である必要があります。したがって、 type の空のリストを正しく計算します。xaya -> af (+) [][a][a -> a]Num af (+) []Num a => [a -> a]

これで問題ありませんが、GHCi は式の結果を出力しようとします。Num a => [a -> a]関数を出力する方法がないため、 type の値を出力する方法はありません。これは基本的にGHCiがあなたに与えているエラーです: No instance for (Show (t0 -> t0)).

関数やその関数の呼び出しには、実際には何も問題はありません。印刷できない関数の(空の)リストが得られるだけです。代わりにバインドした場合let、エラーは発生せず、通常はNum a => [a -> a].

于 2012-07-06T08:19:54.863 に答える
1

f (+) []関数は関数のリストを返します。

Prelude> :t f (+) []
f (+) [] :: Num t => [t -> t]

show結果のリストの各要素で関数を呼び出そうとする前奏曲ですが、関数は Show 型クラスのインスタンスではありません。

于 2012-07-06T08:15:34.737 に答える
1

関数のタイプfは次のとおりです。

Prelude> :t f
f :: (t -> a) -> [t] -> [a]

次のように関数を呼び出す場合:

Prelude> f (+) []

(+)... 型を取得します (この例では s に対してのみ機能するふりをしましょうInt):

(+) :: Int -> Int -> Int
(t -> a) = (Int -> (Int -> Int))
t = Int
a = (Int -> Int)

これは、 の 2 番目の引数fの型が で[t] = [Int]あり、戻り値の型がであることを意味し[a] = [Int -> Int]ます。戻り値の型は関数のリストであり、関数を表示できないghciため、型エラーのために式の「コンパイル」が拒否され、表示されるエラーが発生します。

于 2012-07-06T08:12:29.967 に答える