在不同的上下文中使用的多态变量haskell

时间:2014-01-13 00:15:48

标签: haskell polymorphism

我有一段Haskell代码:

foo :: Num a => (a -> a) -> Either Integer Double -> Either Integer Double
foo f x = case x of
  Left i -> Left $ f i
  Right d -> Right $ f d

它不会编译错误“无法匹配类型Integer with Double”。我了解f的类型分别在Integer -> IntegerDouble -> Double表达式中计算为LeftRight,从而产生了冲突。

如何更改此功能,以便每次都使用正确版本的f

1 个答案:

答案 0 :(得分:6)

您需要RankNTypes

{-# LANGUAGE RankNTypes #-}

foo :: (forall a. Num a => a -> a) -> Either Integer Double -> Either Integer Double
foo f x = case x of
    Left i -> Left $ f i
    Right d -> Right $ f d