私はGHCでどのように強力な関数のオーバーロードがあるかを研究しています。私は、次のコードを書いている:なぜHaskellのこのタイプの注釈が必要ですか?
class F_third_arg a where
run_f :: (Integer, a) -> Integer
instance F_third_arg Integer where
run_f (_, x) = x
instance F_third_arg String where
run_f (x, _) = x
my_fun :: (F_third_arg a) => Integer -> (a -> Integer)
my_fun x = \a -> run_f(x, a)
main :: IO()
main = putStrLn $ show(((my_fun::Integer->(Integer->Integer)) 5) $ 6)
は(はい、私は-XTypeSynonymInstances -XFlexibleInstancesを必要とする)と、コンパイラがmy_fun
への呼び出しの近くに型注釈が必要であることを、私は驚きました。これは2つの数字に適用されます - このアノテーションを推測することで何が問題になりますか?これらの2つの拡張機能をオンにして、オーバーロードのルールは何ですか?
'FlexibleInstances'は既に' TypeSynonymInstances'を意味しています。 'putStrLn。 show'は 'print'と同じです。そして、あなたはかなり多くの括弧を省略することができます... – leftaroundabout
** defaulting **については(もちろん、コンパイラは_infer_型ではありません:数値リテラルは多相です!)、私はそれについての専門家ではありません。しかし、GHCの拡張デフォルトルールがその仕事をします( '{ - #LANGUAGE ExtendedDefaultRules# - }'かGHCi)。より良い方法は 'print $ my_fun 5(6 :: Integer)'です。 – leftaroundabout
ありがとう!あなたのコメントは本当に役に立ちます。 –