我有一段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 -> Integer
和Double -> Double
表达式中计算为Left
和Right
,从而产生了冲突。
如何更改此功能,以便每次都使用正确版本的f
?
答案 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