【问题标题】:27 different Bool to Bool values in HaskellHaskell 中的 27 个不同的 Bool 到 Bool 值
【发布时间】:2013-09-14 00:55:08
【问题描述】:

有人能解释一下为什么27 有不同的Bool->Bool 值,而11 可以在Haskell 中定义吗?

【问题讨论】:

  • Bool->Bool 值”是什么意思?你的意思是类型签名Bool -> Bool的函数吗?

标签: haskell logic


【解决方案1】:

Bool 类型的值共有三个:TrueFalse 和底部(评估未完成的表达式或评估变成错误的表达式)。

然后,从AB 的函数数量呈指数级增长。更确切地说是|B| ^ |A|

因此,有3^3 = 27 类型的Bool -> Bool 函数。

现在,对于问题的第二部分:从底部开始的函数只能是 2:一个不断返回True,一个不断返回False。然后你必须将函数的数量从{True, False} 添加到{True, False, bottom},即3^2。因此,您总共将拥有9+2=11 函数。

编辑:以下是 11 种可能的功能:

B 是底部,TTrueFFalse。最后一行代表const Trueconst False 函数,而前三行代表测试参数值的函数。这就是前三行将B 映射到B 的原因:测试bottom 的值除了bottom 之外不会产生任何其他结果。

我希望现在更清楚了。

【讨论】:

  • 仅详细说明第二部分:您只能定义一个子集的原因是您无法测试函数的输入是否为底部。想想底部是无限计算的情况:观察它是无限计算的唯一可靠方法是观察它(停止问题等),它永远不会终止。所以你只能对输入做三件事:测试 True,测试 False,或者忽略它。
  • 是的。感谢您澄清这一点。
  • bottom -> bottom 不能存在,因为您无法知道参数是否为 bottom
  • 我同意这个图表,但不同意你原来的解释。一旦你想映射 True -> something,你只能从底部映射到底部(不能将底部映射到其他东西)。这限制了底部可以映射的位置的选择。 (尼尔提到了这一点)此外,还有一些常量函数可以将所有内容映射到相同的值。但是您没有建立这种联系,而是从底部仅声明两个可能的映射。从图中可以清楚地看出,从底部开始存在三种可能的映射,但其中一种与 3^2 中计算的函数重叠。
  • 这种类型的居民实际上有 28 个,因为函数也可以是底部的。但是,const undefined 无法与undefined 区分开来,除非存在seq。这就是为什么我更喜欢快速和松散的推理......
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 2021-06-16
  • 2016-08-07
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多