6

我可以以某种方式缓存i.toString这个简单的函数定义吗?

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

我想保持这个功能简单,没有经典的多行,大括号封闭的功能..

4

6 回答 6

6

你可以这样做:

def palindrome(i: Int) = ((s:String) => s == s.reverse)(i.toString)
于 2013-04-11T19:04:16.827 回答
6

好吧,Scala 没有像一些传统函数式语言那样的 let 语句,但这主要是因为 val + 大括号实现了相同的目的。您是反对多行部分还是反对大括号?因为它很难被击败:

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

尝试省略大括号可能只会增加字符数。

于 2013-04-11T19:18:09.773 回答
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

虽然这可以优雅地解决您的问题,但我建议更改palindromefrompalindrome(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 回答
1

开始Scala 2.13,标准库提供了链接操作pipe,可用于转换/管道i.toString检查字符串是否为回文的函数:

import scala.util.chaining._

def palindrome(i: Int) = i.toString.pipe(s => s == s.reverse)
于 2018-10-03T22:00:59.310 回答
0

需要准确地引用某事物两次的情况经常出现,因此将其丰富到一个方法中是很有用的:

implicit class DiamondMapper[A](val a: A) extends AnyVal {
  def diamond[B](f: (A,A) => B) = f(a,a)
}

然后:

scala> 575.toString.diamond(_ == _.reverse)
res1: Boolean = true

这是管道运算符的一个特例(|>如果您喜欢符号表示法),但它是一个足够常见的用例,您可能想要创建自己的用例。

(这里的 Diamond 是因为它取一个值,将其一分为二,然后再次合并。)

于 2013-04-11T20:20:25.620 回答