下面的代碼無法編譯: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
,並提供以下錯誤:
Couldn't match type `Integer' with `Double'
Expected type: Either Integer Double
Actual type: Either Integer a
In the expression: Right $ f d
In a case alternative: Right d -> Right $ f d
這是一個後續問題this question,問題要解決使用RankNTypes:
(forall a. Num a => a -> a)
但是答案並沒有說什麼。我想知道:
這個錯誤的根本原因是什麼? 最終結果將只是其中一個案例分支,f不會同時鍵入兩種類型,
f
的類型應檢查長度爲f :: Num a => (a -> a)
,可以是整數 - >整數或雙精度 - >雙精度工作,有人可以詳細說明爲什麼這會導致錯誤?有沒有其他方法可以修復錯誤?爲什麼RankNTypes會修復錯誤?這讓我感覺像前一天得到的Monomorphism Restriction錯誤,但啓用它並不能幫助我解決這個問題,顯式類型註釋也不起作用。
只是想象它會typecheck。你可以叫'foo(+ 1.5)(左5)'嗎?如果不是,爲什麼不呢?如果是的話,結果會是什麼? –
除了類型的問題,你可以寫'foo f =(Left。f)(Right。f)'。 –