0

空行が入力されるまで入力を取得する必要があり、空行が入力されると、各行の最初のすべての文字を (1 つの単語として) 印刷する必要があります。最後の行に何を書くべきか誰か説明できますか?

inp :: IO String
inp
   = do
      line <- getLine
      if null line
         then return ""
         else do
            lines <- inp
            return lines????
4

1 に答える 1

3

すべてを台無しにしたくはありませんが、いくつかのヒントを以下に示します。

  1. Stringは、実際には の別の名前です[Char]
  2. (:) :: a -> [a] -> [a]古いリストと同じように新しいリストを作成できますが、関数 (特に ) を使用して新しい要素を前面に追加し(:) :: Char -> String -> Stringます。この関数は「cons」と読み上げることができます。たとえば、1:[2,3,4]は と同じで[1,2,3,4]'a':"bcd"は と同じ"abcd"です。
  3. head :: [a] -> aリストが空でないことが確実な場合は、関数 (特に)を使用して最初の要素を要求できますhead :: String -> Char
  4. 別の戦略として、 and / /を使用する代わりにパターン マッチングを調べることをお勧めします。これにより、多くの場合コードの臭いであるの必要もなくなります。nullifthenelsehead

コメントから、最後の行として次のようなことも試しました。

return head(lines) : []

ここでの主な問題はreturn、それが Haskell のキーワードではなく、単純な古い関数であることです。したがって、引数が式の場合は、括弧で囲む必要があります (または、括弧を回避するためのさまざまなトリックのいずれかを使用します)。

return (head(lines) : [])
return (head lines : [])
return $ head lines : []
return [head lines]
let answer = head lines : [] in return answer

など。これにより、型チェックと実行が行われる場所が表示されます。その後、コードの動作のバグの修正を開始できます。=)

于 2012-05-21T18:40:59.597 に答える