此程序不会输入检查:
$ runghc a.hs
a.hs:12:25:
Couldn't match expected type `Word32' with actual type `Integer'
In the second argument of `div', namely `ix'
In the expression: len "ABCDEF" `div` ix
In an equation for `iy': iy = len "ABCDEF" `div` ix
但是,如果我删除wy
或iy
,则确实如此。为什么呢?
import Data.Word
import Data.List
len = genericLength
wx :: Word32
wx = 3
wy = len "ABCDEF" `div` wx
ix :: Integer
ix = 3
iy = len "ABCDEF" `div` ix
main = print 1
答案 0 :(得分:4)
可能是因为MonomorphismRestriction
。如果你没有给len
明确的类型,那么haskell总会解释一个单形类型。因此,在这种情况下,第一次看到len
时,它会将其类型解释为[a] -> Word32
。现在第二次使用len
时,它会找到期望的类型[a] -> Integer
并返回类型错误。给len
显式类型修复了这个。
len :: Integral i => [a] -> i
len = genericLength
或添加NoMonomorphismRestriction
语言扩展名,以消除此限制。
{-# LANGUAGE NoMonomorphismRestriction #-}