2017-10-21 10 views
0

ように私は型コンストラクタとデータコンストラクタを次ていますタイプの署名機能

data Compose f g x = MkCompose (f (g x)) 

は、作曲についてのプレリュードで型シグネチャを取得し、それが示しています

MkCompose :: f (g x) -> Compose f g x 

それは関数のように示しているのはなぜ?

私は、次のようなタイプを適用すると:

*ComposeExercise> :t MkCompose [[42]] 
MkCompose [[42]] :: Num x => Compose [] [] x 

を次に私にとって、それは明らかです。あなたが書く

+0

これが最も一般的な署名であるためです。 'MkCompose'がコンストラクタであることを覚えておいてください。 2番目の例では、パラメータはすでに入力されています。 –

+1

ここでは、正確にどのような問題がありますか? 'MkCompose'はコンストラクタです。これは定義による関数です。それについてはっきりとはっきりしないものは何ですか? – AJFarmar

+0

Aha。私はとても愚かです。なぜそれが関数f(g x) - > Compose f g x'として示されるのかは明らかではなかった。 –

答えて

4

data Compose f g x = MkCompose (f (g x)) 

あなたはそれを言っている:

MkCompose :: f (g x) -> Compose f g x 

Composeの定義であること。これはdataの宣言のようなものです。あなたはそれを引数を与えるしかし

、(それが機能しているので)、以下、fg、およびxが与えられている特定のタイプのように:

λ> :t MkCompose [[1]]     -- f = [], g = [], x = Num n => n. 
MkCompose 1 :: Num n => Compose [] [] n -- As in the definition. 

MkComposeがあるため、正確に関数型を持っています関数です。それは価値を取り、別のものを返します。

これが明確でない場合は、ここではいくつかの他の例は以下のとおりです。

  • MkCompose (Just [1]) :: Num n => Compose Maybe [] nJust [1] :: Num n => Maybe [n]以来。この場合、f = Maybe,g = []、およびx = Num n => nです。
  • MkCompose getLine :: Compose IO [] ChargetLine :: IO [Char]以降です。この場合、f = IO,g = []、およびx = Charです。
  • MkCompose [[]] :: Compose [] [] x[[]] :: [[x]]からです。この場合、f = [],g = []でもxでも構いません。
関連する問題