2017-04-26 6 views
0

私は1行のテキストエディタを作成しようとしているプログラムを持っています 私はこの時点で少し壁に来ました。 私はlistの文字をleftといい、right という名前の文字を関数またはリストに入れました。left ++ charのcharはユーザーが入力したcharです。リストを変更することはできませんが、再定義することはできますか? この擬似コードは、これはState Monadが何のためにあるのかで事前同じ変数に変数を変更しましたか?

+3

はい、まあ、あなたは "影"をつけることができます。しかし、新しいバインディングが古いものと完全に分離されているかのようになります。新しい定義に別の名前を使用するだけではできないシャドウイングでは何もできません。 – luqui

+0

"変更"と "再定義"の違いは何ですか?変数が値にバインドされると、それ以上変更することはできません。しかし、新しい変数をいくつかの新しい値に定義することができます。新しい変数は古い変数と同じ名前でも構いませんが、新しい変数です。 – chi

+0

さて、 'let left =" new "+" value "'のように 'left'をシャドウできますが、' let left = left ++ in'は 'left'の再帰的定義を作成します。その値は 'left'の古い値と' in'を組み合わせた新しい 'left'を作成しません。 – chepner

答えて

2

left = "hello" 
in = get user input 
left = left ++ in 

感謝を助けている場合。リンクが役立つはずです(チュートリアルを指しています)。あなたの例は次のようになります:

type Line = State String() 
addInput :: String -> Line 
addInput inp = do 
    left <- get 
    put $ left ++ inp 
runState (addInput <user input>) "hello" 

しかし、これは少しモナドを知る必要があります。リンクの例に従ってください。

+0

これを 'addInput inp = modify(++ inp)'に短縮することができます。 – leftaroundabout

関連する問題