Screaming Loud

日々是精進

scalaの無名関数でハマった

今回は無名関数周りでハマりました。

特定のURL「http://hoge.com」に対して、
入力したものを結合するという実装をしていました。

無名関数内でパターンマッチを行い、返り値を出し分けるという実装をしました。

val url = {id:Option[String] => {
  id match {
    case Some(s) => {
      "http://hoge.com/" + s
    }
    case None => println("input id error")
  }
}}

def test(url:String){
}

test(url(Option("id")))

このまま実行すると、

type miss match
 found   : Any
 required: String
test(url(Option("id")))
        ^
one error found

でエラーになります。


Stringを返しているのに、なんで変わるんだ?と理由がわからず、

test(url(Option("id")).toString) // 明示的にStringに変更

これで動きました。

無名関数を実装するとAny型で返却されるんですね。
URLをちょっと無名関数で変換程度に考えていたのですが、Anyを許容していない限り、返り値がしっかり定義される通常の関数をなるべく使ったほうがいいですねー。

P.S.
コメントより、case文の返り値を一致させていないことが原因でした。
通常関数を使うというより、無名関数の場合は返り値の型を統一させましょう!ですね。