簡體   English   中英

ghci中的錯誤,我無法在寫入的haskell文件中重現

[英]Error in ghci which I cannot reproduce in written haskell file

我試圖用ghci檢查這個stackoverflow的答案 ,並得到以下錯誤:

> 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 對於sorthead我得到預期的類型:

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

這是可怕的單態限制的錯誤。 基本上,因為你沒有為m指定類型,GHCi會為你猜測它。 在這種情況下,它猜測m應該具有類型[()] -> () ,即使這顯然不是你想要的。 只要給m的類型簽名GHCi ,你會沒事的。

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

您可以使用禁用Monomorphism限制

> :set -XNoMonomorphismRestriction

但它通常非常方便,否則您必須為通常不會在交互模式下的事物指定許多類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM