【发布时间】:2011-11-06 05:44:52
【问题描述】:
Haskell 的类型推断引擎比 Scala 的要强大得多。在 Haskell 中,我很少需要显式编写类型,而在 Scala 中,类型只能在表达式中推断,而不能在方法定义中推断。
例如看下面的Haskell代码sn-p:
size xs = loop xs 0
where
loop [] acc = acc
loop (_ : xs) acc = loop xs (acc+1)
它返回一个列表的大小。 Haskell 编译器可以识别使用了哪些类型以及函数定义是什么。等效的Scala代码:
def size[A]: List[A] => Int = xs => {
def loop: (List[A], Int) => Int = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
或者使用方法定义:
def size[A](xs: List[A]) = {
def loop(xs: List[A], acc: Int): Int = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
我的问题是:为什么我不能像下面这样写?
def size = xs => {
def loop = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
再次使用方法定义:
def size(xs) = {
def loop(xs, acc) = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
是因为还没有人实现它吗? Scala 的类型系统是否没有这种情况所需的强大?还是有其他原因?
【问题讨论】:
-
@Kevin:在我看来不像是复制品。
-
@missingfaktor - 推理只是整个类型系统的一个子集,但“重复”是 SO 表达这种关系的最接近的方式。
标签: scala haskell type-inference