是否有仅用于一种可能实现的纯函数术语?

时间:2019-04-13 17:08:04

标签: functional-programming ocaml

我正在考虑诸如身份函数之类的函数:

val f : 'a -> 'a
let f x = x

合成功能:

val compose : ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c)
let compose f g x = f (g x)

或适用的map函数,如果已定义了Monadic returnbind函数:

val return : 'a -> 'a t
val ( >>= ) : 'a t -> ('a -> 'b t) -> 'b t

val ( >>| ) : 'a t -> ('a -> 'b) -> 'b t
let ( >>| ) t f = t >>= fun x -> f x |> return

在每种情况下,都可以编写一个纯粹的函数(忽略相同逻辑的等效表示形式)来满足该函数的类型签名。

有这样的功能术语吗?为什么只有一个实现?

1 个答案:

答案 0 :(得分:0)

您可以定义自己的函数理论,其中上述函数将具有一些特殊的语义,

type _ fn =
  | Ident : ('a -> 'a) fn
  | Compose : (('b -> 'c) fn -> ('a -> 'b) fn -> ('a -> 'c)) fn
  | Map : (('b -> 'c) fn -> ('a -> ('a -> 'c) -> 'c) fn -> ('a -> ('a -> 'b) -> 'c)) fn
  | Gen : 'a -> 'a fn

最小语义是将这些抽象化为OCaml函数(即应用程序函数)

let rec app : type s. s fn -> s = function
  | Ident -> fun x -> x
  | Compose -> fun f g x -> app f (app g x)
  | Map -> fun ret bind x f -> app bind x (fun x -> app ret (f x))
  | Gen f -> f

请注意,提供的app函数很愚蠢,因为它没有使用ComposeMap应用程序中的函数语义知识,即Map Ident IdentIdentCompose Ident xx,甚至可以从这种简单的理论中推断出许多其他身份。这一切留给读者练习:)

当然,这一额外的间接层将很明显,因为您不能直接写Ident x,而必须写app Ident x。以及将所有常规功能纳入您的理论中,例如

let 7 = app (Gen (+)) 3 4.