1

私は署名IO [(Int、Int)]で書かれるべきであるプログラムに本当の問題を抱えています。本当に初心者の私には、それがどのように見えるべきかを理解するのはかなり難しいです. したがって、これはタスクです。ユーザーから空の行までの行を使用して手順を作成する必要があります。その後、すべての行の長さを返す必要があります。私はそれを例でより理解しやすくしようとします

*メイン>テイク

kdfdfdf

dfdfeer

えれれ

[(7,7),(7,0)]

読んでいる部分はかなり理解できますが、実際には私が望むように機能しません

Read
 = do
    putStrLn "User, your turn!" 
    line <- getLine
if line==""
    then return ...
    else do
        line <-Read
        return line {- actually doesn't return a line -}

誰かがこれの書き方を理解してくれたら、とてもうれしいです

4

1 に答える 1

5

リードに正確に何をしてもらいたいですか?そのままでは、いくつかの理由でコンパイルされません。大文字で始まる関数または定数に名前を付けることはできません。これらはデータ コンストラクター用に予約されています。また、ご存知だと思いますが、この行return ...は Haskell では有効な構文ではありません。

各行の長さを返したいだけの場合、ペアのリストが必要な理由がよくわかりません。このようなものが機能します。

lineLengths :: IO [Int]
lineLengths = do
    putStrLn "User, your turn!"
    line <- getLine
    if line == ""
        then return []
        else do
            moreLines <- lineLengths
            return $ (length line) : moreLines

これにより、ユーザーは行を入力するように求められます。空の行の場合は、対話を停止するために必要な空の行の長さを気にしないと仮定して、空のリストが返されます。それ以外の場合は、再帰的に行の長さを計算された lineLengths のリストに追加します。

編集:

本当にペアのリストが必要な場合は、おそらくこのような別の関数を使用するのが最善の方法だと思います。

toPairs :: [Int] -> [(Int,Int)]
toPairs [] = []
toPairs [x] = [(x,0)]
toPairs (x:y:zs) = (x,y) : toPairs zs

次に、これを読み取り関数と組み合わせるために、次のことができます。

lineLengthPairs :: IO [(Int,Int)]
lineLengthPairs = do
    ls <- lineLengths
    return $ toPairs ls
于 2012-06-11T01:56:08.183 に答える