我正在考虑诸如身份函数之类的函数:
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 return
和bind
函数:
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
在每种情况下,都可以编写一个纯粹的函数(忽略相同逻辑的等效表示形式)来满足该函数的类型签名。
有这样的功能术语吗?为什么只有一个实现?
答案 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
函数很愚蠢,因为它没有使用Compose
和Map
应用程序中的函数语义知识,即Map Ident Ident
是Ident
,Compose Ident x
是x
,甚至可以从这种简单的理论中推断出许多其他身份。这一切留给读者练习:)
当然,这一额外的间接层将很明显,因为您不能直接写Ident x
,而必须写app Ident x
。以及将所有常规功能纳入您的理论中,例如
let 7 = app (Gen (+)) 3 4.