作者yauhh (哟)
看板PLT
标题Re: [比较] 我为何锺情於用 Scala 做为兵刃(三)
时间Sat Jan 22 00:46:05 2011
※ 引述《brianhsu (坟墓)》之铭言:
: 也因为如此,Scala 的做法是让我比较习惯的:map、filter、length 这些
: 东西,是 List 物件的方法。
: 换句话说,上面的程式,在 Scala 中会长得像下面这样:
: ====================== 我是 Scala 程式分隔线 =========================
: val xs = List(-1, -2, -3, 0, 1, 2, 3)
: val square = (n: Int) => n * n
: val isGreaterThan5 = (n: Int) => n > 5
: val result = xs.map(square).filter(isGreaterThan5).length
: // 上面那行和下面这行等价
: // val result = xs.map(n => n * n).filter(n => n > 5).length
: println (result1)
: ======================================================================
我觉得 val result = xs.map(square).filter(isGreaterThan5).length
一句却把物件导向演绎到极致了. 它意思是 xs 是物件,
xs.map(square) 变成另一个物件,而且也是 List, 所以
(xs.map(square)).filter(isGreaterThan5) 又变成另一个 List 物件.
"任何函数都是物件",的确如此,连函数处理结果也是物件.
跟一般 functional 所讲的有一点差别的是: 这一串程式的点点串接也是个
高阶函数,就像 (f . g . h) 的这种点点一样. 只是在 Java 场合要表达成
以标的物为首,之後再接上要传递给标的物的各种讯息,包括 method 与函数参数.
Java机制或 Scala 语言的最底层把点点处理掉了. 不晓得点点这部份可以怎麽写呢?
前面所说 post-functional 说得也很好,恰好是在 Java-Scala 场合就要用
很混搭的,很 meta 的方式理解语言的二个构面.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.64.101
1F:推 godfat:罗嗦些: f compose g compose h apply 5 // left-assoc 01/25 04:21