2016-04-16 11 views
1

特定のタイプのクラスの関数を使用していて、どのような具体的な型を指定していない場合でも、GHCIではこのことが少し混乱します。次のコードを考えてみましょう:ghciのジェネリック関数の結果を表示する

pure (1+) <*> pure 1 
> 2 

私はそれを理解する方法、あなたはGHCiのに何かを入力すると、それは式を評価し、その上にputStrLn . showを呼び出します。しかし、どのようにこれを評価することができますか?なぜこれは2ですか?つまり、それは理にかなっており、ほとんどのApplicativeインスタンスではおそらく2ですが、確かに知る方法はありません。私たちは式の型をチェックすると、我々が得る:十分

pure (1+) <*> pure 1 :: (Num b, Applicative f) => f b 

OK、公正、種類が合理的に見えますが、任意の型クラスのインスタンスが、指定がなかったので、GHCiの/ Haskellはときに呼び出すように機能するのか分かりませんでしたか私はpure/<*>と書いていますか?

他の言語の直感では、これはエラーであるはずです。 OOP言語で静的にインスタンスメソッドを静的に呼び出そうとしているようなものです(明らかに同じではありませんが、私が得ているような感じです)。

ここでは何が起こっていますか?

+0

デフォルトのタイプはhttps://downloads.haskell.org/~ghc/latest/docs/html/users_guide/interactive-evaluation.html#extended-default-rulesです。また、ghciがIOモナドで動作するとき、 'f'は' IO'に解決されます。 – zakyggaps

+0

ありがとう!私が受け入れることができるように答えを投稿してもらえますか? – kai

答えて

5

それはGHCiのの二つの特徴が原因です: - しかしrecommandedない - IntegerからNum b => bは(1が実際にfromInteger 1であることがわかり、あなたが定義することが解決

  1. type defaulting、いくつかの数値データ型をどのfromInteger 1 + fromInteger 1 == kでそしてshow k == "3"です)、
  2. ghci全体がIOモナドで実行され、if an expression can be instantiated to an IO action, then it will beなので、Applicative f => fIOに解決されます。式がC1 f => f aタイプで、IOがそのタイプクラスC1のインスタンスでない場合、ghciはあいまいエラーを発生させます。
関連する問題