相关疑难解决方法(0)

为什么Scala的类型推断不像Haskell那样强大?

Haskell的类型推理引擎比Scala强大得多.在Haskell中,我很少需要显式地编写类型,而在Scala中,类型只能在表达式中推断,而不能在方法定义中推断.

例如,请参阅以下Haskell代码段:

size xs = loop xs 0
  where
    loop [] acc = acc
    loop (_ : xs) acc = loop xs (acc+1)
Run Code Online (Sandbox Code Playgroud)

它返回List的大小.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)
}
Run Code Online (Sandbox Code Playgroud)

或者使用方法定义:

def size[A](xs: List[A]) = {
  def loop(xs: List[A], acc: Int): Int = xs match {
    case Nil => acc
    case _ …
Run Code Online (Sandbox Code Playgroud)

haskell scala type-inference

44
推荐指数
4
解决办法
5118
查看次数

Scala与F#问题:他们如何统一OO和FP范式?

Scala和F#采用的方法在统一OO和FP范例方面有哪些主要区别?

编辑

每种方法的相对优点和缺点是什么?如果,尽管支持子类型,F#可以推断函数参数的类型然后为什么不能Scala?

comparison paradigms f# functional-programming scala

40
推荐指数
6
解决办法
8888
查看次数

是什么让Haskell的类型系统比其他语言的类型系统更"强大"?

阅读Scala类型系统与Haskell的缺点?我不得不问:具体来说,它使Haskell的类型系统比其他语言的类型系统(C,C++,Java)更强大.显然,即使Scala也不能执行与Haskell类型系统相同的功能.具体来说,是什么让Haskell的类型系统(Hindley-Milner类型推断)如此强大?你能给我举个例子吗?

haskell types type-systems type-inference hindley-milner

36
推荐指数
5
解决办法
1万
查看次数

为什么类型推断对面向对象语言不切实际?

我正在研究一种新的编程语言的想法,理想情况下我希望这种语言能够混合一些功能和程序(面向对象)的概念.

我对Haskell这样的语言非常着迷的事情之一是它是静态类型的,但你不需要注释类型(魔术感谢Hindley-Milner!).

对于我的语言我真的很喜欢这个,但是在阅读了这个主题后,似乎大多数人认为类型推断对于子类型/面向对象是不切实际/不可能的,但是我不明白为什么会这样.我不知道F#,但我知道它使用Hindley-Milner并且是面向对象的.

我真的想要对此进行解释,并且最好是关于面向对象语言无法进行类型推断的场景的示例.

language-agnostic oop functional-programming type-inference static-typing

12
推荐指数
2
解决办法
1096
查看次数

Scalaz镜头组成

这里真的很简单.看完镜头的精彩介绍后:

http://www.youtube.com/watch?v=efv0SQNde5Q

我想我可能会尝试谈谈中的一个简单例子:

import scalaz.Lens._
fst.andThen(snd).set(((1,2),3),9)
Run Code Online (Sandbox Code Playgroud)

之后是这个错误

error: type mismatch;
 found   : scalaz.Lens[(Nothing, Nothing),Nothing]
 required: scalaz.Lens[(Nothing, Nothing),C]
Note: Nothing <: C, but class Lens is invariant in type B.
You may wish to define B as +B instead. (SLS 4.5)
              fst.andThen(snd).set(((1,2),3))
                      ^
Run Code Online (Sandbox Code Playgroud)

有关如何使这项工作的任何想法?

scala scalaz lenses

10
推荐指数
2
解决办法
1087
查看次数