2016-03-31 23 views
1

コースの優秀な成績を得るために、私はMLで完了した課題を再作成することになっていますが、代わりにhaskellを使用しています。ここでの目標は、値を文字列にバインドするデータ型環境を作成することです。Haskellでの環境データ型の作成

MLでの型宣言は次のとおりです。作成した

type 'a Env = string -> 'a; 

基本的な機能は、空の環境を作成しenv_new()、環境、文字列、および値を取り、戻しながら値に文字列を結合しenv_bind()あります新しい環境。次のようにMLの機能を示す

テストは以下のとおりです。Haskellのと関連した機能で、このタイプの

- val e1 = env_new() : int Env; 
val e1 = fn : int Env 
- val e2 = env_bind e1 "a" 100; 
val e2 = fn : int Env 
- val e3 = env_bind e2 "b" 200; 
val e3 = fn : int Env 
- e1 "a"; 
uncaught exception NameNotBound 
- e2 "a"; 
val it = 100 : int 
- e3 "a"; 
val it = 100 : int 

私の現在の宣言は次のとおりです。

data Env a = Env String a 

envNew :: a -> Env a 
envNew a = Env a 

envBind :: Env a -> String -> a -> Env a 
envBind environment name value = Env name value 

私は考え出す非常に苦労していますこれらの定義のための適切な構文。これについて進歩を助けるヒントをお答えください。これは優等賞のためのものであることを覚えておいてください。私は完全な解決策を期待するのではなく、単に解決策を拒否する援助をしています。

+0

型をデータコンストラクタと混同しないでください。たとえば、 'Env" Foo "" Bar "は、' Env String'型の値を生成します(この例では9が 'Int'であると仮定します)。' Env 'Bar "9" Env Int'。これが 'envNew'を定義しようとするあなたの試みにどう影響するか考えてみましょう。 – chepner

+0

'タイプEnv a =文字列 - > a'はあまりにも明白でした。 (あなたのHaskellの型は、SMLの 'datatype 'に対応する文字列*' a'のEnv = Envです。) – molbdnilo

答えて

3
data Env a = Env String a 

これは、MLと同じタイプではありません。上記の矢印はありません。あなたは

envNew :: a -> Env a 
envNew a = Env a 

が、これはMLと同じタイプを持っていない、そして、

data Env a = Env (String -> a) 

をしたいです!それを修正してください。

はまた、

envBind :: Env a -> String -> a -> Env a 
envBind environment name value = Env name value 

はほとんど意味を作る:それも環境を使用しません。あなたが持っているMLの定義から始め、そのMLを模倣しようとします。