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 有类型漏洞吗?
对我来说,程序中的一个漏洞可以帮助我推进实施。它通过告诉我接下来需要什么类型来做到这一点。您可以通过触发常规 Scala 类型错误来获得类似的结果。
诀窍是定义一个你知道会出错的类型,然后使用它。例如:
object hole
Run Code Online (Sandbox Code Playgroud)
然后你可以在代码中使用它,你会得到一个适当的类型错误:
这里的错误告诉我“洞”需要是一个B
,这表明我可以通过g
某种方式使用。如果我将代码推进到a => f(g(hole))
编译器会告诉我hole
需要是A
.
这是一种漏洞,但与其他语言(伊德里斯等)不同......
hole
是一个可接受的类型!正如您所说的???
是一个有用的占位符,但它具有类型Nothing
——这意味着程序可以编译,但它不能帮助您填写实现。至少object hole
,虽然有点微不足道,但确实为您提供了一些类型的信息来推进。
Scala???
只是抛出异常的简写,相当于 Haskellundefined
或 justerror "not implemented"
或类似的。
Scala 编译器不支持类型化漏洞。但是,您可以???
在 IDE 或 Emacs+Ensime 中使用并检查其类型以查看其推断类型。
与 Haskell 等语言的完整 Hindley-Milner 类型推断相比,Scala 的类型推断相对较少。这意味着在 Scala 编译器中有类似类型漏洞的东西是不可行的。