functional-programming - 纯函数只有一种可能的实现吗?

标签 functional-programming ocaml

下图中有一个快速解释,为什么纯函数似乎只有一种可能的实现。
我不太明白这个想法,因为 (++) : ('a -> 'b) -> ('a -> 'b) -> 'a -> 'b 例如可以通过 let (++) (f: ('a -> 'b )) (g: ('a -> 'b)) x = f x
let (++) (f: ('a -> 'b)) (g: ( 'a -> 'b)) x = g x
这张图片是错误的还是我错过了什么?

enter image description here

最佳答案

你是对的。即使没有类型注释,所附图像也不正确。

首先,重要的是要考虑这里假设的实现的“平等”类型。让我们考虑以下示例。

  1. (@@) 等于 (@@+) 吗?

    let ( @@ ) f x = f x
    let ( @@+ ) f x =
      let _ = 42 in
      f x
    
  2. (|>) 等于 (|>+) 吗?

    let ( |> ) x f = f x
    let ( |>+ ) x f = f @@ x
    
  3. (%) 等于 (%+) 吗?

    let ( % ) f g x = f (g x)
    let ( %+ ) p q r = p (q r)
    

如果(@@)不等于(@@+),那么我们可以构造函数的第五个实现bool -> bool,例如(fun x -> let _ = 42 in true)

因此,图像的作者希望不是通过其实现(或代码)来区分函数,而是通过一些其他元素(例如其行为)来区分(如 duck test 或数学函数的等式)。

尽管如此,图像还是不正确。该图像声称“对于签名中没有任何具体类型的纯函数,只有一种可能的实现”,但事实并非如此。例如,不存在纯函数'a -> 'b。这可以通过 the Curry–Howard correspondence 显示.

关于functional-programming - 纯函数只有一种可能的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737625/

相关文章:

scala - 如何对 Set[ValidatedNel[String, Double]] 求和?

asynchronous - 简单 UDP 服务器 OCaml/Async

functional-programming - ocaml 中 2 个列表的乘积(不带命令式函数)

Scala从for循环返回一个值

functional-programming - 在 Erlang 中作为参数的函数

functional-programming - 库里-霍华德同构产生的最有趣的等价是什么?

function - 在 F# 中,是否可以检查两个值是否具有相同的构造函数?

module - OCaml 模块中的私有(private)值?

javascript - 如何使用算法 W 键入检查递归定义?

ocaml - 带元组的 let-in 表达式的求值顺序