4

Haskellで置換アルゴリズムを書こうとしています。Subst a単一のコンストラクターでポリモーフィックデータ型を次のように定義しS::[(String, a)] -> Subst aました。

data Subst a = S [(String, a)]

single::String -> a -> Subst aここで、単一の変数のみの置換を作成するための関数を作成したいと思います。

これは私が試したものです:

single::String -> a -> Subst a
single s1 (Subst a) = s1 a

ただし、次のエラーが発生します。Not in scope: data constructor 'Subst'

誰かが私が間違っていることについて洞察を持っていますか?

4

2 に答える 2

8

データコンストラクターは型コンストラクターと同じものではありません

あなたのコードでは、型コンストラクターデータコンストラクターですSubstS

型コンストラクターは、新しい型を作成するために使用されます。たとえば、indata Foo = Foo (Maybe Int) Maybeコンストラクター、Fooデータコンストラクターです(型コンストラクターと同様ですが、発見したとおりに別の名前を付けることができます)。データコンストラクターは、型のインスタンスを作成するために使用されます(これを、ポリモーフィック型のインスタンスの作成と混同しないでください。たとえばInt -> Int、のインスタンスですa -> a)。

したがってS、関数でパターンマッチングを行う場合に使用する必要がありますsingle。ありませんSubst

うまくいけば、それは理にかなっています、そうでなければ、教えてください:)

PSデータコンストラクターは、すべての目的と目的において、関数です。つまり、PSデータコンストラクターを使用すると、通常は関数を使用する場合と同じことができます。たとえば、実行できmap Bar [a,b,c]、各要素にデータコンストラクターが適用されます。

于 2012-11-05T17:52:25.603 に答える
3
single :: String -> a -> Subst a
single str a = S [(str, a)]

パーツは、1つの[(str, a)]要素を持つリストを作成します。その要素はタプル(または「ペア」)でstrあり、タプルの左側がタプルaの右側にあります。次に、上記の関数は、その単一要素リストをSコンストラクターでラップして、タイプSubstaの値を作成します。

str結果は、からの値への単一の置換のルールを含むリストですa

于 2012-11-05T18:42:24.387 に答える