我只是想知道如何在纯函数式语言中连接 API 而不会引入副作用?
问问题
212 次
2 回答
5
纯函数式语言,如 Haskell,支持通过“外语函数接口”调用外语函数。
出现的问题是如何将外语函数的类型和行为编码为纯函数语言(例如 Haskell)。
有两种情况需要考虑:
纯函数
没有副作用的外语函数可以直接嵌入,没有语义问题。一个例子是sin :: CDouble -> CDouble
在 C 中。
不纯函数
不纯函数有副作用。他们经常在外语方面修改状态。必须按依赖/顺序顺序调用此类函数,以便正确排序副作用。
要将其嵌入到纯函数式语言中,您可以在外部函数之间传递一个标记,代表状态。每次调用外部函数时,都会返回一个新令牌,而旧令牌则被丢弃。所以
let state0 = initState
(v, state1) <- foreignFunction state0
(u, state2) <- foreignFunction state1
return (v,u)
副作用被捕获为修改(通过关联)state
变量的纯函数。来回传递这些可确保安全。
要隐藏传递状态令牌的管道,您可以使用 monad。
例如,这种方法对于与来自 Haskell 的有状态的外部 API 进行交互非常常见。一个产品示例:mersenne-twister 装订。,它使用MTGen
令牌作为库已初始化的证据。
于 2012-05-09T18:00:44.357 回答
0
如果 API 也不是纯功能性的,那么您就不能。最好的办法是隔离变异效果,以便在您的代码中轻松识别它们。
于 2012-05-09T17:48:04.513 回答