【发布时间】:2013-09-14 00:55:08
【问题描述】:
有人能解释一下为什么27 有不同的Bool->Bool 值,而11 可以在Haskell 中定义吗?
【问题讨论】:
-
“
Bool->Bool值”是什么意思?你的意思是类型签名Bool -> Bool的函数吗?
有人能解释一下为什么27 有不同的Bool->Bool 值,而11 可以在Haskell 中定义吗?
【问题讨论】:
Bool->Bool 值”是什么意思?你的意思是类型签名Bool -> Bool的函数吗?
Bool 类型的值共有三个:True、False 和底部(评估未完成的表达式或评估变成错误的表达式)。
然后,从A 到B 的函数数量呈指数级增长。更确切地说是|B| ^ |A|。
因此,有3^3 = 27 类型的Bool -> Bool 函数。
现在,对于问题的第二部分:从底部开始的函数只能是 2:一个不断返回True,一个不断返回False。然后你必须将函数的数量从{True, False} 添加到{True, False, bottom},即3^2。因此,您总共将拥有9+2=11 函数。
编辑:以下是 11 种可能的功能:
B 是底部,T 是 True,F 是 False。最后一行代表const True 和const False 函数,而前三行代表测试参数值的函数。这就是前三行将B 映射到B 的原因:测试bottom 的值除了bottom 之外不会产生任何其他结果。
我希望现在更清楚了。
【讨论】:
bottom -> bottom 不能存在,因为您无法知道参数是否为 bottom。
const undefined 无法与undefined 区分开来,除非存在seq。这就是为什么我更喜欢快速和松散的推理......