haskell - 写一个给定类型的总的,终止 Haskell 函数
问题描述
给定一个类型,确定你是否可以编写一个总的、终止的 Haskell 函数。
对于类似 的类型Int -> Int
,我们知道有限精度整数类型 Int 至少覆盖范围[-2^29, 2^29-1]
,因此我们可以有从 Int 到 Int 的有限多个可能的映射,因此我们可以编写一个总的终止函数。
例如,给定以下类型:(a -> b) -> (b -> c) -> (a -> c)
,我如何确定我们是否可以编写一个总终止函数来使用该类型作为函数签名?还是这种类型(a -> c) -> ((a, b) -> c)
。
非常感谢通过这个问题的指导!这是一个家庭作业问题,所以我只是寻求指导。
解决方案
鉴于:
(a -> b) -> (b -> c) -> (a -> c)
我们知道,Curry-Howard 对应关系不一定是部分->
的——将产品类型解释为 AND,将 sum 类型解释为 OR——我们发现它形成了一个重言式。但是为了找到一个实现并知道它是 total,我们需要实际找到证明:
(a → b) → (b → c) → a → c
-- ~~~~~~~~~~~~~~~~~~~~~~~~~
-- currying
-- ~~~~~~~~~~~~~~~~~~~~~~~~~
(a → b) ∧ (b → c) → a → c
-- ~~~~~~~~~~~~~~~
-- currying
-- ~~~~~~~~~~~~~~~
(a → b) ∧ (b → c) ∧ a → c
-- ~~~~~~~~~~~~~~~~~
-- commutativity of AND
-- ~~~~~~~~~~~~~~~~~
(b → c) ∧ (a → b) ∧ a → c
-- ~~~~~~~~~~~
-- modus ponens
-- ~
(b → c) ∧ b → c
-- ~~~~~~~~~~~
-- modus ponens
-- ~
c → c
-- ~~~~~
-- reflexivity of implication
-- ~
1
(这是一个假设的三段论。)
我们可以使用这个证明来实现一个实现——跳过这里的柯里化步骤,并使用对应于函数应用的方式:
f ab bc a = bc (ab a)
该论点类似于(a -> c) -> ((a, b) -> c)
解释(a, b)
为a ∧ b
(逻辑与)。
推荐阅读
- python - 如何合并包含相同和不同行和列名称的不同数据框
- postgresql - 在 Postgraphile 中,对多对多关系使用权限
- html - 即使没有添加不透明度,画布和边框也显示透明
- java - 跟踪 Spark 结构化流中的消费消息
- css - Angular:使用 fxflex 将垫子工具提示与左对齐
- django - 通过文件名获取 ImageField 中文件的实例
- html - background-size: 100% 100% 上传后不起作用
- python - 使用 CV2 对视频进行镜像/对称效果
- python - BeautifulSoup - 不能按标点符号过滤列表结果
- numpy - np.dot 给出关于形状的值错误