6

このstackoverflowの回答をghciでチェックしようとしたところ、次のエラーが発生しました。

> import Data.List
> let m = head . sort
> m [2,3,4]

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

残念ながら、書かれた haskell ファイルでエラーを再現することはできません:

-- file.hs
import Data.List

main = do
    let m = head . sort
    putStrLn $ show $ m [2,3,4]

このファイルを実行するとrunhaskell file.hs、期待値が得られます2。ghci セッションでの間違いは何ですか?

編集:関数mにはghciの奇妙なタイプがあることに注意しました:

> import Data.List
> let m = head . sort
> :t m
m :: [()] -> ()

これはなぜですか?それはタイプを持っているべきではありませんOrd a => [a] -> aか?Forsorthead私は期待されるタイプを取得します:

> :t sort
sort :: Ord a => [a] -> [a]
> :t head
head :: [a] -> a
4

1 に答える 1

7

これは恐ろしいモノモーフィズムの制限の欠点です。基本的に、 の型を指定しなかったのでm、GHCi が推測します。この場合、それは明らかにあなたが望んでいるものではありませんmが、 type を持つべきだと推測します。型シグネチャを[()] -> ()与えるだけで問題ありません。mGHCi

> :set +m  -- multiline expressions, they're handy
> let m :: Ord a => [a] -> a
|     m = head . sort

モノモーフィズムの制限を無効にすることができます

> :set -XNoMonomorphismRestriction

しかし、通常は非常に便利です。それ以外の場合は、対話モードでは通常行わないものに対して多くの型を指定する必要があります。

于 2014-04-03T13:55:17.840 に答える