Est*_*oro 3 api functional-programming referential-transparency
我只是想知道如何使用纯函数式语言连接API而不引入副作用?
纯函数式语言(如Haskell)支持通过"外部函数接口"调用外语函数.
出现的问题是如何将外语函数的类型和行为编码为纯函数语言(例如Haskell).
有两种情况需要考虑:
纯粹的功能
可以直接嵌入没有副作用的外语函数而不会出现语义问题.一个例子是sin :: CDouble -> CDouble在C.
不纯的功能
不纯的功能有副作用.他们经常修改外语方面的状态.必须以依赖/顺序顺序调用此类函数,以便正确排序副作用.
要将它嵌入到纯函数式语言中,您可以向外部函数传递令牌,表示状态.每次调用外部函数时,都会返回一个新标记,旧标记将被丢弃.所以
let state0 = initState
(v, state1) <- foreignFunction state0
(u, state2) <- foreignFunction state1
return (v,u)
Run Code Online (Sandbox Code Playgroud)
副作用被捕获为修改(通过关联)state变量的纯函数.来回传递这些确保安全.
要隐藏传递状态标记的管道,可以使用monad.
例如,这种方法非常适用于与来自Haskell的有状态外部API进行交互.产品示例:mersenne-twister绑定.,它使用MTGen令牌作为库已初始化的证据.
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |