【问题标题】:Difference between unit type and 'a in ocamlocaml中单位类型和'a之间的区别
【发布时间】:2018-04-30 12:31:27
【问题描述】:

OCaml 中的unit -> unit'a -> 'a 有什么区别?

例如:

# let f g a = if (g a > a) then a ;;
val f : (unit -> unit) -> unit -> unit = <fun>

# let f g a = if (g a > a ) then a else a;;
val f : ('a -> 'a) -> 'a -> 'a = <fun>

为什么第一个给unit -&gt; unit,第二个给'a -&gt; 'a

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

    请注意,在 OCaml 中,if 是一个表达式:它返回一个值。

    理解你的问题的关键是

    if condition then a
    

    等价于

    if condition then a else ()
    

    if 的输入规则如下:

    • 条件应该有类型bool
    • 两个分支应该具有相同的类型
    • 整个 if 表达式与分支的类型相同

    换句话说,在if cond then a 中,a 应该具有unit 类型。

    【讨论】:

      【解决方案2】:

      第一个变体中的if 表达式没有else 子句,因此if 表达式的真正分支必须具有unit 类型。这意味着a 的类型也必须是unit,并且g 的类型必须是unit -&gt; unit

      在第二个变体中,由于else子句,唯一的要求是if表达式的真假分支具有相同的类型,所以类型泛化,@987654331的类型也一样@。

      【讨论】:

      • 单元类型是只有一个值的类型,写成()。如果你写if c then a,有一个隐含的else () 分支。
      • @AhmedBaoun 将单元类型视为 void 类型可能会有所帮助
      【解决方案3】:

      unit 是函数不返回任何内容时使用的类型(基本上是打印内容的函数)

      'a 是中性类型。它是任何类型的占位符。

      【讨论】:

      • 单元类型一开始是个奇怪的概念。我个人将其翻译为“副作用”,如果一个函数在输入处有来自副作用的数据,我添加一个单位类型参数,如果输出有副作用,我从单位类型返回单位值。这是一种用«警告副作用区域»记录您的代码的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2016-02-17
      • 2012-12-09
      相关资源
      最近更新 更多