Haskell中有27种不同的Bool到Bool值

Mac*_*zny 26 logic haskell

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

Mih*_*eac 51

有类型的三个值Bool:True,False和底部(表达式的量,评价没有完成或表达式的量,评价变成错误).

然后,还有功能从一个指数AB.更确切地说|B| ^ |A|.

因此,有3^3 = 27类型的功能Bool -> Bool.

现在,对于问题的第二部分:从底部开始的函数只能是2:一个不断返回True,一个不断返回False.然后,你必须从增加的函数的数量{True, False}{True, False, bottom}这是3^2.所以,总的来说你会有9+2=11功能.

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

11个功能

B是底部,TTrue,FFalse.最后一行表示const Trueconst False函数,而前三行表示测试参数值的函数.这就是为什么前三行映射BB:测试bottom的值不能导致除bottom之外的任何其他内容.

我希望现在更清楚了.

  • 只是详细说明第二部分:你只能定义一个子集的原因是你无法测试函数的输入是否为底部.想想底部是无限计算的情况:观察它是无限计算的唯一可靠方法是观察它(停止问题等),它永远不会终止.因此,您只能使用输入执行三项操作:test for True,test for False或忽略它. (16认同)
  • 实际上有28个类型的居民,因为功能也可以是底部.但是,除了存在`seq`之外,`const undefined`不能与`undefined`区分开来.这就是为什么我更喜欢快速而宽松的推理. (8认同)
  • 我同意图表,但不是你原来的解释.一旦你想要映射True - >某事,你只能从底部到底部映射(不能将底部映射到其他东西).这限制了底部可以映射的选择.(Neil提到了这一点)另外还有一些常量函数可以将所有内容映射到相同的值.但是你没有建立这种连接,而是从底部声明了两个可能的映射.从图中可以清楚地看出,从底部有三种可能的映射,但是一种与3 ^ 2中计数的函数重叠. (3认同)
  • `bottom - > bottom`不能存在,因为你不知道参数是否是`bottom`. (2认同)