6

i.toString関数のこの単純な定義でどうにかしてキャッシュできますか?

def palindrome(i: Int) = i.toString == i.toString.reverse

この関数をシンプルに保ち、古典的な複数行の中括弧で囲まれた関数を使用したい..

4

6 に答える 6

6

Scala には従来の関数型言語のような let ステートメントがありませんが、それは主に val + 波括弧が同じ目的を果たしているためです。複数行の部分または中括弧全般に反対していますか? 打ち負かすのはかなり難しいので:

def palindrome(i: Int) = { val s = i.toString; s == s.reverse }

中括弧を省略しようとしても、文字数が増えるだけです。

于 2013-04-11T19:18:09.773 に答える
6

あなたがすることができます:

def palindrome(i: Int) = ((s:String) => s == s.reverse)(i.toString)
于 2013-04-11T19:04:16.827 に答える
5

次の前方パイプ演算子を使用します。

scala> implicit class PipedObject[A](value: A) {
     |   def |>[B](f: A => B): B = f(value)
     | }
defined class PipedObject

scala> def palindrome(i: Int) = i.toString |> (s => s == s.reverse)
palindrome: (i: Int)Boolean

これにより問題がエレガントに解決されますが、署名をpalindromeからpalindrome(Int)に変更してpalindrome(String)で呼び出すpalindrome(i.toString)(名前を に変更するisPalindrome) ことをお勧めします。

于 2013-04-11T19:20:21.533 に答える
3

ワンライナーですが、ブレースはまだここにあります。ただし、私には短いようです:

def palindrome(i: Int) = { val s = i.toString; s == s.reverse }

そのような関数がたくさんある場合は、次のようなこともできます。

@inline def let[T, R](expr: =>T)(body: T => R): R = body(expr)

def palindrome(i: Int) = let(i.toString) { s => s == s.reverse }
于 2013-04-11T19:17:13.593 に答える