いくつかのことが間違っています。
(x:[])
と(x:xs)
のパターンマッチングの周りにカッコが必要です。
また、空のリストのケースが見つからないため、クラッシュする可能性があります。これをより安全に処理するには、Maybe
を使用し、空のリストにNothing
を返します。 はとなる可能性があります。空のリストでプログラムをクラッシュさせることはできますが、それは一般的に悪い書式とみなされます。 Maybe
タイプを使用すると、最も単純な方法で関数が正常でない結果を返す可能性があることを明示的に示すことができます。他の言語では、入力が悪いとnull
が返されることがあります。
何も比較していないので、Eq
のタイプクラッシュは必要ありません。さらに、宣言がa
の値を返すべきであると言うときにStringを返すことになります。私はこの実装をお勧めします。
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (_:xs) = mylast xs
今、あなたはあなたの例で示した元のテキストを表示するためにmylast
の結果を使用することができ、加えて、空のリストが提供された場合は、(むしろクラッシュより)優しいメッセージを表示することができます。
displayLast :: Show a => [a] -> String
displayLast list =
case mylast list of
Nothing -> "The list was empty!"
Just lastItem -> "Last element is " ++ (show lastItem)
欠落括弧( 'mylast(X:[])= ...')。また 'a'を返す関数から' String'を返すことはできませんし、 'x'をそれに追加することもできません。 –
'last'は要素のアイデンティティに依存するのではなく、位置だけで' Eq'修飾を必要としません。 – karakfa