2016-04-05 10 views
1
mylast :: (Eq a) => [a] -> a 
mylast x:[] = "Last element is " ++ x 
mylast x:xs = mylast xs 

私は、リストLの最後の要素をmylast関数の入力として探したいと思っていました。 リストには整数や文字、または文字列が含まれている可能性があるため、リストの要素のタイプがEqに属していることを示すためにEq typeclassを使用しましたが、次のエラーが発生しています: LastEle.hs:2:1:パターン:マイラプログラムリストの最後の要素を検索するには?

+1

欠落括弧( 'mylast(X:[])= ...')。また 'a'を返す関数から' String'を返すことはできませんし、 'x'をそれに追加することもできません。 –

+1

'last'は要素のアイデンティティに依存するのではなく、位置だけで' Eq'修飾を必要としません。 – karakfa

答えて

2

いくつかのことが間違っています。

(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) 
+1

'Maybe a'の結果が試みられた' String'結果よりもずっと有用である理由を説明したいかもしれません。それは私たちには明らかですが、新人には不必要な抽象化の匂いがするかもしれません。 – dfeuer

+0

@Chad Gilbert私はJust Removeによってスクリプトを実行しようとしました。そして、エラーを投げていました。ちょうど実際に何をしていますか? –

+0

@ v.sharathchandra - 内容を記述する文字列を返すことによって 'mylast'によって返された' Maybe a'の戻り値の使い方の例を使って、私の答えを更新しました。 「Just」は成功した価値を包み込むものと考えてください。 –

-2
Prelude> :info last 
last :: [a] -> a  -- Defined in `GHC.List' 

Prelude> last [1..10] 
10 

Prelude> last [] 
*** Exception: Prelude.last: empty list 
関連する問題