2016-03-29 18 views
-1

これはnewtypeのです:タイプの意味は何ですか?

newtype Combine a b = Combine { unCombine :: (a -> b) } 

私はこのラインについて多くのことを理解する問題を抱えているが、最初は中括弧です。彼らは何ですか?ここで何をしていますか?2つの入力データ型から関数を作成しますか?

+1

newtypeがあなたを混乱させる場合は、チュートリアルを読んで2冊目を読んで、irc.freenode.netの#haskellで質問をすることをお勧めします。代数的データ型の概念はあなたに新しいですか?はいと言うのは大丈夫です!私は、このコンセプトが、私がハスケルについて話し合ったときに多くの人々を混乱させることが分かった –

答えて

4

中括弧はレコードの構文を可能にします。これは、次のために、短手と考えることができます:あなたは自分自身でそれを定義する必要はありませんので、

newtype Combine a b = Combine (a -> b) 

unCombine :: Combine a b -> (a -> b) 
unCombine (Combine a) = a 

レコード構文が自動的にunCombine関数を作成します。あなたの型に型パラメータがたくさんあるときは便利です。

+0

このことが何をするのか分かりません。しかし、私はそれが別の質問のためのものだと思います。明日まで受け入れて待っています。 –

+3

本当に何もしません。これは、 'a'型の引数をとり、' b'型の値を返す関数のラッパーです。その後、 'let f = Combine(\ x - > x + 3)'を実行すると、 '(unCombine f)5'を実行して8を返すことができます。 – chepner

+3

レコード構文は**と厳密には等しくありません。上記のコード。たとえば、レコード構文を使用すると、 '(Combine id){unCombine = const 1}'を実行できます。それは彼らができることの一部です。 – Bakuriu

関連する問題