如何使用功能纯粹的语言连接API?

时间:2012-05-09 17:45:56

标签: api functional-programming referential-transparency

我只是想知道如何使用纯函数式语言连接API而不会引入副作用?

2 个答案:

答案 0 :(得分:5)

纯函数式语言(如Haskell)支持通过"foreign function interfaces"调用外语函数。

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

有两种情况需要考虑:

纯粹的功能

没有副作用的外语函数可以直接嵌入而不会出现语义问题。一个例子是C. {/ p>中的sin :: CDouble -> CDouble

不正确的功能

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

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

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

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

要隐藏传递状态标记的管道,可以使用monad。

这种方法非常适用于与来自Haskell的有状态外部API接口。一个产品示例:mersenne-twister binding.,它使用MTGen标记作为库已初始化的证据。

答案 1 :(得分:0)

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