您如何以纯功能语言连接 API



我只是想知道如何在不引入副作用的情况下使用纯函数式语言与 API 连接?

纯函数式语言,如 Haskell,支持通过"外来函数接口"调用外语函数。

出现的问题是如何将外语函数的类型和行为编码为纯函数式语言(例如 Haskell(。

有两种情况需要考虑:

纯函数

没有

副作用的外语函数可以直接嵌入,没有语义问题。一个例子是 C 语言中的sin :: CDouble -> CDouble

不纯函数

不纯函数有副作用。他们经常在外语方面修改状态。必须按依赖/顺序调用此类函数,以便正确对副作用进行排序。

要将其嵌入到纯函数式语言中,您可以在表示状态的外部函数之间传递令牌。每次调用外部函数时,您都会返回一个新令牌,而旧令牌将被丢弃。所以

let state0 = initState
(v, state1) <- foreignFunction state0
(u, state2) <- foreignFunction state1
return (v,u)

副作用被捕获为修改(通过关联(state变量的纯函数。来回传递这些可确保安全。

要隐藏传递状态令牌的管道,您可以使用 monad。

例如,这种方法对于与来自 Haskell 的有状态外部 API 进行接口非常常见。一个产品示例:mersenne-twister 绑定,它使用 MTGen 令牌作为库已初始化的证据。

如果 API 不是纯粹的功能,那么你就不能。最好的办法是隔离突变效果,以便在代码中轻松识别它们。

相关内容

  • 没有找到相关文章

最新更新