use*_*230 22 io functional-programming referential-transparency
由于副作用破坏了参考透明度,它们是否违背功能语言的观点?
sep*_*p2k 23
纯函数式编程语言使用两种技术来模拟副作用:
1)表示外部状态的世界类型,其中该类型的每个值由类型系统保证仅使用一次.
在使用这种方法的功能的语言print,并read可能具有类型(string, world) -> world和world -> (string, world)分别.
它们可能会像这样使用:
let main w =
let w1 = print ("What's your name?", w) in
let (name, w2) = read w1 in
let w3 = print ("Your name is " ^ name, w2) in
w3
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
let main w =
let w1 = print ("What's your name?", w) in
let (name, w2) = read w in
let w3 = print ("Your name is " ^ name, w2) in
w3
Run Code Online (Sandbox Code Playgroud)
(因为w使用了两次)
所有带副作用的内置函数都将获取并返回世界值.由于具有副作用的所有函数都是内置函数或调用具有副作用的其他函数,这意味着所有具有副作用的函数都需要获取并返回一个世界.
这样就不可能使用相同的参数调用带有副作用的函数两次,并且不会违反参照透明度.
2)IO monad,其中所有具有副作用的操作必须在该monad内执行.
使用这种方法,所有带副作用的操作都会有类型io something.例如,print将是一个类型的函数,string -> io unit并read具有类型io string.
访问执行操作值的唯一方法是使用"monadic bind"操作(例如,在haskell中称为>> =),IO操作作为一个参数,并且函数描述如何处理结果作为另一个操作数.
上面的例子看起来像monadic IO:
let main =
(print "What's your name?") >>=
(lambda () -> read >>=
(lambda name -> print ("Your name is " ^ name)))
Run Code Online (Sandbox Code Playgroud)
JUS*_*ION 13
有几种选项可用于处理函数式语言中的I/O.
有一篇研究论文详尽地分析了这些.
功能I/O是一个正在进行的研究领域,还有其他语言以有趣和令人头疼的方式解决了这个问题. Hoare逻辑用于一些研究语言.其他人(如Mercury)使用唯一性输入.还有一些(如 清洁)使用效果系统.其中我对水星的接触非常非常有限,所以我无法对细节做出真正的评论.有一篇论文详细介绍了Clean的I/O系统,但是,如果你对这个方向感兴趣的话.
| 归档时间: |
|
| 查看次数: |
4541 次 |
| 最近记录: |