2016-05-19 10 views
0

私は、名前、月、日を含む生年月日の3タプルのリストを持っています。私は新しいタプルを追加し、birthBookを見せたいと思います。しかし、値を追加または削除した後、birthBookは変更されません。
tom 5 6を追加した後に、print birthBookが "dd" 4 5を表示するだけです。つまり、(tom、5,6)はbirthBookに追加されません。私は何をすべきか?haskellの要素を追加して削除した後にリストを保存する方法は?

birthBook::[(String,String,String)] 
birthBook=[("dd","4","5")] 

prompt :: String -> IO() 
prompt todos = do 
    putStrLn "Enter a command(add,remove,print)" 
    cmd <- getLine 
    interpret cmd todos 
interpret :: String->String-> IO() 
interpret "print"  todos= do 
    print(birthBook) 
    prompt todos 
interpret "add"  todos= do 
    putStrLn "Enter a name" 
    cmdname<-getLine 
    putStrLn "Enter an integer month" 
    cmdmonth<-getLine 
    putStrLn "Enter an integer day" 
    cmdday<-getLine 
    print(add birthBook cmdname cmdmonth cmdday) 
    prompt todos 
add::(Eq key)=>[(key,v,z)]->key->v->z->[(key,v,z)] 
add birthBook name month day = (name, month, day):birthBook 

main= prompt [] 
+0

プログラムのどこでも 'add'を使用しません。 – erisco

+0

あなたのプログラムに 'print'コマンドを入力したとき、あるいは' add'コマンドをタイプしたときにだけdd "4 5'が得られますか? –

+0

新しいタプルを追加したにもかかわらず、私がprintと打つとdd 4 5しか得られません。新しいタプルを追加して、それらのすべてを印刷したい。 –

答えて

2

ここでの問題は、あなたがHaskellのを忘れていることは、純粋に機能的であり、デフォルトでは可変などの値を扱わないということである:
はここに私のコードです。

変更を反映させるためには、出生図書をpromptinterpretの引数として渡す必要があります。また、最初の宣言であるbirthBookを印刷しようとしていました。これはHaskellが完全に機能するプログラミング言語であり、何かを変更したい場合は、新しいデータコピーを作成する必要があります。私はあなたの解釈ルーチンの最後に置いた表現をlet newBirthBookとしています。

{-# LANGUAGE OverloadedStrings #-} 
module Main where 

birthBook::[(String,String,String)] 
birthBook=[("dd","4","5")] 

prompt :: [(String,String,String)] -> String -> IO() 
prompt bBook todos = do 
    putStrLn "Enter a command(add,remove,print)" 
    cmd <- getLine 
    interpret bBook cmd todos 

interpret :: [(String,String,String)] -> String -> String -> IO() 
interpret bBook "print" todos = do 
    print bBook 
    prompt bBook todos 
interpret bBook "add" todos = do 
    putStrLn "Enter a name" 
    cmdname<-getLine 
    putStrLn "Enter an integer month" 
    cmdmonth<-getLine 
    putStrLn "Enter an integer day" 
    cmdday<-getLine 
    let newBirthBook = add bBook cmdname cmdmonth cmdday 
    prompt newBirthBook todos 

add :: (Eq key) => [(key,v,z)] -> key -> v -> z -> [(key,v,z)] 
add birthBook name month day = (name, month, day):birthBook 

main= prompt birthBook [] 
+0

それを取得!ありがとう! –

関連する問題