【发布时间】:2012-01-05 05:06:04
【问题描述】:
所以我最近不小心为一个 Scala 问题写了一个 Haskell 答案。由于对 Haskell 相当熟悉,我很容易找到解决方案:
myMaxBy :: (a -> a -> Ordering) -> [a] -> [a]
myMaxBy _ [] = undefined
myMaxBy f (x:xs) = foldr step [x] xs
where step y acc@(z:_) = case f y z of
GT -> [y]
EQ -> y:acc
LT -> acc
然后有人提醒我这是一个 Scala 问题。我开始将我的代码翻译成 Scala,在经历了很多痛苦之后,我决定了:
(List(xs.head) /: xs.tail) { (acc, y) =>
y compare acc.head match {
1 => List(y)
0 => y :: acc
-1 => acc
}
}
但我终其一生都无法让 Scala 类型系统屈服于我的意愿,并将其概括为一个函数,其中 xs 和 compare 是输入(理想情况下,首先使用比较器进行咖喱输入)。虽然这肯定是由于我对 Scala 不熟悉,但我也略微责怪 Scala 的复杂(尽管非常强大)类型系统。你能帮我看看如何把它变成一个 generalized 函数,其类型签名类似于 Haskell 等价物吗? (阅读:as general as。)如果比myMaxBy(myCompare)(someList)更复杂,也请演示用法。
【问题讨论】:
标签: function generics scala haskell types