Foldable型クラスのデフォルトの型?は[]である事が分かりますが、型クラスのデフォルトの型?の設定・変更を自前ですることは出来ますか?
default
という宣言を使用すると、宣言したモジュールの中限定で変更することができます。
(ただし、GHC 8.8の場合宣言した型は‘Num’ or ‘Show’ or ‘Eq’ or ‘Ord’ or ‘Foldable’ or ‘Traversable’
のインスタンスでないといけないそうです)
GHCi上で次のように入力すると、自分が作った型を自分が作った型クラスのデフォルトの型にできることがわかるでしょう。
追記: ⚠️注意⚠️ @kakkun61 さんの指摘通り、以下のコードはExtendedDefaultRules
というGHCの言語拡張を有効にしないと動きません。
-- わかりやすさのため、デフォルトの型が
-- 使用された場合に警告が出るようにする
> :set -Wtype-defaults
> data MyDefault = MyDefault deriving Show
> :{
> class ClassWithDefault a where
> value :: a
> :}
> :{
> instance ClassWithDefault MyDefault where
> value = MyDefault
> :}
-- 何らかの型クラスについて型推論に失敗して、
-- 「曖昧な型である」と判断した場合に使用するデフォルトの型を設定する
> default (MyDefault)
-- 「デフォルトの型が使用された」という警告の後に、
-- `MyDefault`が表示される。
> value
<interactive>:28:1: warning: [-Wtype-defaults]
? Defaulting the following constraints to type ‘MyDefault’
(Show a0) arising from a use of ‘print’ at <interactive>:28:1-5
(ClassWithDefault a0)
arising from a use of ‘it’ at <interactive>:28:1-5
? In a stmt of an interactive GHCi command: print it
MyDefault
また、型推論の事はよく分かってないのですが、これはこのデフォルトの型?に多少依存している気がするのですが、その辺はどうなっているのでしょうか。
はい、お察しの通り、GHCが型推論に失敗して、「曖昧な型である」と判断した場合、デフォルトの型が採用されます。そのためにデフォルトの型は用意されているのです。
以上の詳細は、英語ですがHaskell 2010の仕様書やGHCのドキュメントにも詳しく載っています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/20 09:11 編集
2020/01/15 02:32