如何在Haskell中定义表示单元类型的类型?

时间:2016-03-13 18:50:51

标签: scala haskell

假设我有一个函数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)
  }
}

1 个答案:

答案 0 :(得分:4)

我不清楚你想做什么。但修复语法和类型错误的一种方法是这样的:

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

然而,我发现这是一个非常奇怪的事情:() -> ()实际上只有少数语义上不同的居民,而且大多数人在Haskell的纯粹方面并没有真正有用的区别。你可能更适合那种容易区分居民的类型。