すべてを台無しにしたくはありませんが、いくつかのヒントを以下に示します。
String
は、実際には の別の名前です[Char]
。
(:) :: a -> [a] -> [a]
古いリストと同じように新しいリストを作成できますが、関数 (特に ) を使用して新しい要素を前面に追加し(:) :: Char -> String -> String
ます。この関数は「cons」と読み上げることができます。たとえば、1:[2,3,4]
は と同じで[1,2,3,4]
、'a':"bcd"
は と同じ"abcd"
です。
head :: [a] -> a
リストが空でないことが確実な場合は、関数 (特に)を使用して最初の要素を要求できますhead :: String -> Char
。
- 別の戦略として、 and / /を使用する代わりにパターン マッチングを調べることをお勧めします。これにより、多くの場合コードの臭いであるの必要もなくなります。
null
if
then
else
head
コメントから、最後の行として次のようなことも試しました。
return head(lines) : []
ここでの主な問題はreturn
、それが Haskell のキーワードではなく、単純な古い関数であることです。したがって、引数が式の場合は、括弧で囲む必要があります (または、括弧を回避するためのさまざまなトリックのいずれかを使用します)。
return (head(lines) : [])
return (head lines : [])
return $ head lines : []
return [head lines]
let answer = head lines : [] in return answer
など。これにより、型チェックと実行が行われる場所が表示されます。その後、コードの動作のバグの修正を開始できます。=)