为什么这个程序只有在我删除函数的使用时才进行类型检查

时间:2013-09-28 13:31:48

标签: haskell type-inference typeclass

此程序不会输入检查:

$ 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

但是,如果我删除wyiy,则确实如此。为什么呢?

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

1 个答案:

答案 0 :(得分:4)

可能是因为MonomorphismRestriction。如果你没有给len明确的类型,那么haskell总会解释一个单形类型。因此,在这种情况下,第一次看到len时,它会将其类型解释为[a] -> Word32。现在第二次使用len时,它会找到期望的类型[a] -> Integer并返回类型错误。给len显式类型修复了这个。

len :: Integral i => [a] -> i
len = genericLength

或添加NoMonomorphismRestriction语言扩展名,以消除此限制。

{-# LANGUAGE NoMonomorphismRestriction #-}