2017-05-15 14 views
1

パターンマッチングを使ってスカラーのリストの最後の要素を探しています。私は、この問題は他の方法を用いて解くことができる知っているが、使用リストの最後の要素を見つけるためのパターンマッチング

(見出さNil.typeがAを必要とする)、次のコード

def last[A](list: List[A]):A = list match { 
case head :: Nil => head 
case head :: tail => last(tail) 
case _ => Nil 
} 

に、すなわちケース_ => nilの型の不一致などのエラーを投げている最後のケースを試しパターンマッチングだけがこれを解決する方法ですか?

リストは汎用タイプなので、NilをタイプAのデフォルト値で置き換えることはできません。これは実行時にのみ決定できます。

この行を削除する:case _ => Nilは明らかに機能しますが、Nil引数の場合には失敗するという警告が表示されます。

このシナリオでNil引数を処理するにはどうすればよいですか?

答えて

2

そうでない場合は、いくつかの要素の戻りSome(lastElement)があるので、もし、結果を返すために使用Option[T]Option.empty

例、

def last[A](list: List[A]): Option[A] = list match { 
    case head :: Nil => Option(head) 
    case head :: tail => last(tail) 
    case _ => Option.empty 
    } 

    it("returns last element") { 

    assert(last(List("apple")) == Some("apple")) 
    assert(last(List("apple", "mango")) == Some("mango")) 
    assert(last(List()) == Option.empty) 
    assert(last(List()) == None) 

    } 
Option[T]にアクセスする方法

last(List("In absentia", "deadwind")) match { 
    case Some(lastValue) => println(s"Yayy there was lastValue = ${lastValue}") //prints Yayy there was lastValue = deadwind 
    case None => println("Oops list was empty") 
} 

last(List()) match { 
    case Some(lastValue) => println(s"Yayy there was lastValue = ${lastValue}") 
    case None => println("Oops list was empty") //prints Oops list was empty 
} 

// or using map 
last(List("In absentia", "deadwind")).map(lastValue => print(s"lastValue is ${lastValue}")) 
+0

(我々はオプションの使用を避けることができるように)一般的なタイプのために、ここ(Javaでのように)「ヌル」に似たものを指定する方法はありますか? – Shashank

+0

「null」のコンセプトを削除することが推奨されるため、お勧めしません。最後の要素は 'some value'でも' empty'でもよい。返された 'Option'値を操作する上で問題がありますか? 'returnedValue match {}'は返された最後の値を処理する方法です – prayagupd

+2

Shashank、まれにこのようなことがパフォーマンスに大きな違いをもたらすかもしれませんが、それは慣用的なScalaではありません。この場合、AをAnyRef、すなわち 'last [A <:AnyRef]'に制限する必要があることに注意してください。 – AmigoNico

2

リストにオブジェクトが含まれているかどうかわからないので、このような状況を一般的に処理する必要があります。私は次のようにあなたのlast方法でオプションの型を返すことをお勧めしたい:

def last[A](list: List[A]): Option[A] = list match { 
    case head :: Nil => Some(head) 
    case head :: tail => last(tail) 
    case _ => None 
} 

は、次に、あなたのコード内で、あなたは結果で動作するようにモナドのようなインターフェースを使用することができます。指定された機能でmapと処理データを使用するか、またはリストが空ではないことを確かめる場合は、getメソッドをオプションで使用することができます。

8

あなたは:+とパターンマッチができます。

def last[A](list: List[A]) = list match { 
    case init :+ last => Some(last) 
    case _ => None 
} 
+0

ニース。もちろん、テール再帰的です。 IMHOこれは正しい答えになるはずです。 – AmigoNico

関連する問題