假设我有一个函数fail'
fail' :: ()
fail' = error "Ka-boom!"
我想定义一个函数failOrNum
它是一个惰性函数。
failOrNum :: () a => (a -> a) -> Num -> Num
failOrNum f n = n + 1
例:
failOrNum fail' 5
我应该指定什么类型的failOrNum
函数来满足条件?
我想实现类似于 Scala 方法的东西:
object LazyComputation extends App {
def failOrInt(execution: => Unit, n: Int): Int = n + 1
println {
failOrInt({throw new RuntimeException("Ka-boom!")}, 5)
}
}
我不是 100% 清楚你想做什么。但是修复语法和类型错误的一种方法是这样的:
fail' :: () -> ()
fail' _ = error "kaboom"
-- OR, to cause errors before this is even applied to an argument,
-- fail' = error "kaboom"
-- these two are distinguishable *only* by the seq function
failOrNum :: Num a => (() -> ()) -> a -> a
failOrNum _ n = n+1
然而,我觉得这是一件非常奇怪的事情:() -> ()
实际上只有少数语义不同的居民,而且他们中的大多数在哈斯克尔的纯正面中并不能真正有效地区分。您可能更适合具有更容易区分居民的类型。