1

该程序不会进行类型检查:

$ 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

但如果我删除wyor 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
4

1 回答 1

4

大概是因为MonomorphismRestriction。如果你不给lenhaskell一个显式类型,那么它总是会解释一个单态类型。因此,在这种情况下,它第一次看到len它会将其类型解释为[a] -> Word32. 现在第二次len使用它找到预期[a] -> Integer的类型并返回类型错误。给出len一个明确的类型可以解决这个问题。

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

或添加NoMonomorphismRestriction消除此限制的语言扩展。

{-# LANGUAGE NoMonomorphismRestriction #-}
于 2013-09-28T14:19:06.823 回答