2010-11-18 19 views
5

私はLYAHを読んでいました。それは私が明示的に作業するには、次の構文を取得するためにControl.Monad.Instancesをロードする必要があると述べている:Control.Monad.Instancesがデフォルトで実装されていない理由( - >)

((fmap (+5)) (+5)) 4 

ことがあるのはなぜ?なぜ、ファンクタがこの基礎となる統一的な技術であれば、その機能を得るには、明示的にControl.Monad.Instancesをロードする必要があります。 ( - >)はどのように実装されていますか(または隠されており、->のみがエクスポートされています)?関数型の上でのfmapの使用がデフォルトで実装されていないのはなぜですか?

+0

参照http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

答えて

10

ここには3つの異なる概念が含まれています。関数型、Functor型クラス、Functor "インスタンス"。関数型( - >)は言語に組み込まれており、その存在と実装はFunctorとfmapとは完全に無関係です。型クラスは、関連するメソッドのシグネチャの仕様です。 「インスタンス」は、その署名の実装です。

あなたの質問を明確にするために、私は「なぜPreludeで提供されているFunctorインスタンス( - >)がないのですか? (Preludeはデフォルトでスコープ内にあるモジュールです)。現在は表現されているので、それは意味をなさない。

修正された質問に対する答えは簡単です:Haskell Report(Preludeのインターフェースが指定されている公式言語仕様)にはそれが含まれていません。おそらくそれはすべきですが、それ以来、ハスケルの言語とライブラリはかなり進化しており、ハスケルの標準はゆっくりと変化する傾向があります。いずれにしても、間違いなく、それが理由です。

2

Functorは言語機能ではなく、ランダムモジュールが定義するのに便利なtypeclassです。そのモジュールのFunctorの定義を使用するには、読み込む必要があります。

関連する問題