为什么不能改变使用任何积分的类型?

时间:2013-06-23 16:33:24

标签: haskell

take :: Int -> [a] -> [a]
genericTake :: Integral i => i -> [a] -> [a]

我已经读过take这个不方便的类型是由于历史原因,而且更改它可能会导致某些代码中断。

但我不能在take替换genericTake而不会破坏任何内容吗?有什么问题?

1 个答案:

答案 0 :(得分:10)

破案

genericTake :: Integral i => i -> [a] -> [a]
genericTake n xs = take (fromIntegral n) xs

class Foo a where
   bar :: a -> String

instance Foo Int where
   bar _ = "int" 

foo :: String -> [a] -> [a]
foo ns xs = let y = read ns
                z = bar y
            in take y xs

这将打破genericTake

No instance for (Foo i0) arising from a use of `bar'
    The type variable `i0' is ambiguous

这是一个熟练的例子,但你可以理解在take的第一个参数上发生的某种类型推断,假设它是Int,现在当你将类型更改为Integral i => i时可能会出现一些问题如上所述。