質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

1回答

1642閲覧

haskell 型クラスのデフォルト型

mightyMask

総合スコア143

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

0クリップ

投稿2020/01/11 17:40

編集2020/01/11 17:46

Haskell

1Prelude> :type length 2length :: Foldable t => t a -> Int 3Prelude> :type +d length 4length :: [a] -> Int

Foldable型クラスのデフォルトの型?は[]である事が分かりますが、型クラスのデフォルトの型?の設定・変更を自前ですることは出来ますか?

また、型推論の事はよく分かってないのですが、これはこのデフォルトの型?に多少依存している気がするのですが、その辺はどうなっているのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/01/14 13:10

編集2020/01/15 03:18
igrep

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

igrep

2020/01/15 02:32

失礼、確かにこのコードはExtendedDefaultRulesを有効にしないとGHCiでしか動かない可能性がありますね... ちょっと確認します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問