Haskell が次のコードの 8 行目の型を判別できない理由がわかりません。expressMaybe 関数の型シグネチャは、結果の型が 2 つの入力パラメーターの型と同じであることを確立していませんか?
{-# LANGUAGE MultiParamTypeClasses #-}
class Gene g n where
express :: g -> g -> g
-- there will be other functions that use the "n" type parameter
expressMaybe :: Gene g n => Maybe g -> Maybe g -> Maybe g
expressMaybe (Just a) (Just b) = Just (express a b) -- line 8
expressMaybe (Just a) Nothing = Just a
expressMaybe Nothing (Just b) = Just b
expressMaybe Nothing Nothing = Nothing
私が得るエラーは次のとおりです。
Amy20.hs:8:40:
Ambiguous type variable `n0' in the constraint:
(Gene g n0) arising from a use of `express'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `Just', namely `(express a b)'
In the expression: Just (express a b)
In an equation for `expressMaybe':
expressMaybe (Just a) (Just b) = Just (express a b)
Failed, modules loaded: none.
RankNTypes と ScopedTypeVariables をいじってみましたが、エラーをなくす方法がわかりませんでした。
よろしくお願いします。
編集:問題を理解したので、Fundeps を使い慣れているので、Fundeps を使用しました。私のアプリケーションでは、遺伝子をエンコードするために複数の「アルファベット」を使用することはあまり意味がありません。ただし、これまで型ファミリを使用したことがないので、それについても調べます。
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
class Gene g n | g -> n where
express :: g -> g -> g
-- there will be other functions that use the "n" type parameter
expressMaybe :: Gene g n => Maybe g -> Maybe g -> Maybe g
expressMaybe (Just a) (Just b) = Just (express a b) -- line 8
expressMaybe (Just a) Nothing = Just a
expressMaybe Nothing (Just b) = Just b
expressMaybe Nothing Nothing = Nothing