2014-01-13 3 views
4

У меня есть следующий фрагмент кода Haskell:Полиморфные переменная используется в различных контекстах 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 с двойной». Я понимаю, что тип f вычисляется как Integer -> Integer и Double -> Double в выражениях Left и Right соответственно, создавая столкновение.

Как я могу изменить эту функцию, так что будет использоваться правильная версия f?

ответ

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 
+0

Изумительный! Это полностью решает мою проблему. – Xilexio

Смежные вопросы