9

インタプリタで作業するときは、関数を名前にバインドすると便利なことがよくあります。次に例を示します。

ghci> let f = (+1)
ghci> f 1
2

fこれにより、名前が関数にエイリアスされます(+1)。単純。

ただし、これが常に機能するとは限りません。nubエラーの原因となる1つの例は、Data.Listモジュールからエイリアスを作成しようとしていることです。例えば、

ghci> :m Data.List
ghci> nub [1,2,2,3,3,3]
[1,2,3]
ghci> let f = nub
ghci> f [1,2,2,3,3,3]

<interactive>:1:14:
    No instance for (Num ())
      arising from the literal `3'
    Possible fix: add an instance declaration for (Num ())
    In the expression: 3
    In the first argument of `f', namely `[1, 2, 2, 3, ....]'
    In the expression: f [1, 2, 2, 3, ....]

ただし、引数を明示的に指定すると、xエラーなしで機能します。

ghci> let f x = nub x
ghci> f [1,2,2,3,3,3]
[1,2,3]

誰かがこの行動を説明できますか?

4

1 に答える 1

3

現在のGhciバージョンのタイプデフォルトルールはやや不可解です。

の型署名を指定できfます。または、以前にChrisからアドバイスされたように、ファイルに追加:set -XNoMonomorphismRestrictionします。~/.ghci

于 2011-12-28T14:36:24.960 に答える