2012-04-07 9 views
5

他の同様の質問に基づいて、私の問題はインデントと関係があるとわかりましたが、それをたくさん混乱させてしまいました。でる。'do'構造の最後のステートメントは、式でなければなりません

addBook = do 
    putStrLn "Enter the title of the Book" 
    tit <- getLine 
    putStrLn "Enter the author of "++tit 
    aut <- getLine 
    putStrLn "Enter the year "++tit++" was published" 
    yr <- getLine 
+0

これは他の人と関連があるかもしれません...私は、タブのインデントと残りのスペースで "do"の最初の行を持っていました:P –

答えて

18

あなたの場合はインデントされません。あなたは本当に式ではないものであなたの機能を終えました。 yr <- getLine - あなたはyrに何が起こるか、それともautの後にこのことが起こりましたか?彼らはちょうどぶら下がって、未使用です。

これが変換する方法を示すために明確ことがあります

だから、
addBook = putStrLn "Enter the title of the Book" >> 
      getLine >>= \tit -> 
      putStrLn "Enter the author of "++ tit >> 
      getLine >>= \aut -> 
      putStrLn "Enter the year "++tit++" was published" >> 
      getLine >>= \yr -> 

、あなたはその最後の矢印を次しているために何をしたいのですか?

+1

また、getLineは、結果がバインドされていなくても呼び出すことができますが、おそらく意図したものではない場合もあります。彼は、 '()'以外の戻り値型を持つものは変数に束縛されなければならないと誤解している可能性があります。 –

7

addBookについて考えてみましょう。それはIO aです。aは何もありません。それは動作しません。モナドには何らかの結果が必要です。

あなたが最後にこのような何かを追加したい場合があります。また

return (tit, aut, yr) 

、あなたは空のタプル(単位)を返し、任意の有用な結果を持ってしたくない場合は:

return() 
+0

awsome!あなたよりもずっと! – user1319603

+5

@ user1319603:あなたのことを思い出してください。「復帰」は、命令的言語のそれとは異なります。ハスケルでは、 'return'は他の関数と同じように機能します。何らかの型の値をとり、これを 'IO a'型の値(この場合は)にします。モナドについて学ぶ前に、この経験則を使用することが最善です: 'do'ブロックの最後のものは、' a'型の 'IOa'型でなければなりません。あなたのケースでは、 'yr < - getLine'は' String'型を持ち、それは許されません(実際に 'IO a→a'型の関数を持つと素敵なプロパティが壊れます)。 – Vitus

+1

@ user1319603あなたを助けてくれたすべての回答をupvote *(上向きの矢印をクリック)し、あなたに一番助けとなる、またはあなたを最も助けた回答を*受け入れる(チェックマークを付けてください)。 – dave4420

0

最後の行は式ではないので削除してください。 putStrLnに渡す文字列に括弧を使用してください。あなたのコード取る場合

1

addBook = do 
    putStrLn "Enter the title of the Book" 
    tit <- getLine 
    putStrLn "Enter the author of "++tit 
    aut <- getLine 
    putStrLn "Enter the year "++tit++" was published" 
    yr <- getLine 

との "翻訳" は "通常"(非do)表記(与えられたp = putStrLn "..."):

addBook = 
    p >> getLine >>= (\tit -> 
     p >> getLine >>= (\aut -> 
      p >> getLine >>= (yr -> 

あなたは(yr ->で終わるされていますそれは意味をなさない。最後に

return() 

:あなたが行うには有益な何かを持っていない場合は、あなただけの空のタプルを返すことができ

addBook = do 
    putStrLn "Enter the title of the Book" 
    tit <- getLine 
    putStrLn "Enter the author of "++tit 
    aut <- getLine 
    putStrLn "Enter the year "++tit++" was published" 
    yr <- getLine 
    return() 

あなたがautを取得する必要があり、なぜあなたは、おそらく自分自身に問う必要がありますし、 yrです。

+0

明示的なかっこの場合+1 ...おそらく 'return(tit、aut、yr)'も適切です...また、 'yr < - getLine; return() '' getLine'だけ書くことができます - 私たちは、 "返す"ことに応じて選択します。 –

関連する問題