Scala 中的类型孔?

Kev*_*ith 9 haskell scala

Haskell 提供类型化的漏洞

例子:

f :: Int -> String -> Bool
f x y = if (x > 10) then True else (g y)

g :: String -> Bool
g s = _
Run Code Online (Sandbox Code Playgroud)

汇编:

Prelude> :l HoleEx.hs
[1 of 1] Compiling Main             ( HoleEx.hs, interpreted )

HoleEx.hs:6:7:
    Found hole `_' with type: Bool
    Relevant bindings include
      s :: String (bound at HoleEx.hs:6:3)
      g :: String -> Bool (bound at HoleEx.hs:6:1)
    In the expression: _
    In an equation for `g': g s = _
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

在 Scala 中编程时,我通常???在我尚未编写的 Scala 代码中用作占位符。

但是,对我来说,使用类型孔似乎更强大。请注意,我可以代替上面else (g y)else (g 55),但我会得到一个编译时错误:

Prelude> :l HoleEx.hs
[1 of 1] Compiling Main             ( HoleEx.hs, interpreted )

HoleEx.hs:3:39:
    Couldn't match type `Int' with `[Char]'
    Expected type: String
      Actual type: Int
    In the first argument of `g', namely `x'
    In the expression: (g x)
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

虽然我可以???在 Scala中使用来编译占位符实现,但与漏洞不同,我会在???.

scala> def g(x: Int): Int = ???
g: (x: Int)Int

scala> g(5)
scala.NotImplementedError: an implementation is missing
Run Code Online (Sandbox Code Playgroud)

Scala 有类型漏洞吗?

Ric*_*way 6

对我来说,程序中的一个漏洞可以帮助我推进实施。它通过告诉我接下来需要什么类型来做到这一点。您可以通过触发常规 Scala 类型错误来获得类似的结果。

诀窍是定义一个你知道会出错的类型,然后使用它。例如:

object hole
Run Code Online (Sandbox Code Playgroud)

然后你可以在代码中使用它,你会得到一个适当的类型错误:

使用孔时编译器错误的屏幕截图

这里的错误告诉我“洞”需要是一个B,这表明我可以通过g某种方式使用。如果我将代码推进到a => f(g(hole))编译器会告诉我hole需要是A.

这是一种漏洞,但与其他语言(伊德里斯等)不同......

  • 我的程序只是没有编译,而不是有一个公认的漏洞;
  • 没有帮助告诉我范围内的类型(尽管 IDE 代码完成我给出了一些建议);
  • 我不能很好地命名一个洞;
  • 我不能自动将一个洞提升到一个函数定义;
  • 我无法自动解决这个洞(有时 Idris 可以);
  • 必须输入预期的返回值,否则 Scala 会推断这hole是一个可接受的类型!
  • ...可能还有许多其他功能。

正如您所说的???是一个有用的占位符,但它具有类型Nothing——这意味着程序可以编译,但它不能帮助您填写实现。至少object hole,虽然有点微不足道,但确实为您提供了一些类型的信息来推进。


Eri*_*lun 5

Scala???只是抛出异常的简写,相当于 Haskellundefined或 justerror "not implemented"或类似的。

Scala 编译器不支持类型化漏洞。但是,您可以???在 IDE 或 Emacs+Ensime 中使用并检查其类型以查看其推断类型。

与 Haskell 等语言的完整 Hindley-Milner 类型推断相比,Scala 的类型推断相对较少。这意味着在 Scala 编译器中有类似类型漏洞的东西是不可行的。