はthis を読んでしまったと私は、コードのいくつかの部分は何をすべきかを把握しようとしています。メソッドシグネチャHaskellのユーザー定義型
infixl 4 :+:
infixl 5 :*:, :/:
infixr 6 :^:
data Expr a = Var Char
| Const a
| (Expr a) :+: (Expr a)
| (Expr a) :*: (Expr a)
| (Expr a) :^: (Expr a)
| (Expr a) :/: (Expr a)
deriving (Show, Eq)
と、次の機能があります::
まずは、データ型定義があります
simplify :: (Num a, Eq a, Floating a) => Expr a -> Expr a
simplify (Const a :+: Const b) = Const (a + b)
simplify (a :+: Const 0) = simplify a
simplify (Const 0 :+: a ) = simplify a
だから、「何(NUM、式、フローティング)= > Expr a "はこの場合のためのものですか?
"Expr"はコンストラクタではなく、最初の行では "+(Expr Expr)"なので、ここでは "a"は何を意味し、なぜ2倍に制限されていますか? そして、「」「」機能の2行目では、ここでもあれば、明らかExprにある?に関連する型シグネチャでありますか型クラスNum
、Eq
とFloating
ためのインスタンスがある各タイプa
について
「+(Expr Expr)」はどこにもありません。何を参考にしていますか? BTW、 'Expr a'は、コンストラクタが' Var、Const、(:+ :)、(:* :)、(:^ :)、(:/ :) 'の型です。表記 – chi
理解に役立ついくつかの用語: 'Expr'は、*型変数* aから型を構築するため、*型のコンストラクタです。 'Expr'は通常の1種類のデータ型(' * ')を取り、別の通常のデータ型(' * ')を返すため、* kind *' * - * * 'を持ちます。 'Var'、' Const'、 ':+:'などは引数が何であっても 'Expr a'sを構築するので、*データコンストラクタです。 'Var :: Char - > Expr a'、' Const :: a Expr a'、 '(:+ :) :: Expr a - > Expr a - > Expr a'などに注意してください。 – Lazersmoke