作者Schelfaniel (Schelfaniel)
看板java
标题Re: purely functional (原 [问题] SCJP6.0)
时间Wed Aug 5 18:39:06 2009
※ 引述《godfat (godfat 真常)》之铭言:
: 果然出去吃个饭回来就断线了 orz
: p 币看来会少很多 :s
p 币到底是什咩??
: 效率好不好嘛,上面是说效率很好,有人说效率有 C 的 1/2
: 我觉得像是这种本身就具有大量 state 的问题,
: purely functional 本身是不太可能比得赢 C 之类直接的操作啦...
其实就算不是 purely functional,绝大多数语言都比不赢 C 的啦。
: 回到 monad, 大抵上的概念就是我们把「状态」视为一种值,
: 而每一次状态改变,则会产生新的值,再把这个值继续传递下去。
我觉得 godfat 这比喻不错,我之前一直视 monad 是一种包装。
: 就可以看成是:
: Y = puts("Hello, World!", X)
: Z = puts("Heelo, World!", Y)
其实上是
puts("Hello, World!")
会变成一个 function 输入值 X
输出值 Y
也就是说 puts("Hello, World!") 姑且称做第一行
puts("Hello, World!") 姑且称做第二行
第一行在 Haskell 会展开成类似
f(X) -> puts("Hello, World!"); return Y;
^^^^ ^^^^^^^^
这两段是 Haskell 自动产生的
同理第二行是
g(Y) -> puts("Hello, World!"); return Z;
以上算自创语法,其实和 godfat 的说法一致啦
所以实际上会变成
g( f( X ) )
X : 前次系统状态,系统自行代入
f ( X ) : 印出第一行的 Hello World ( 传入值 X )
g ( f ( X ) ) : 印出第二行的 Hello World ( 传入值 f (X) )
类似这样的 :QQQ
不过如果这边把 clojure 的 java-object 也当成一种 Monad 说不定也行,
只是 clojure 是动态语言,就算这样做也没实际影响 :QQ
: 这些 state 也不会影响到其他 state, 那在 compile 时,
: 基本上就可以完全舍弃掉。这就是最佳化要解决的问题了...
: 理想上当然是能把抽象化程式,依照目前机器架构,做最好的最佳化。
: 把所有多余也不关心的操作都拿掉。GHC 本身就有很多很多的最佳化.. XD
GHC 算函式语言之中很不错的了说 :QQ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.29.28.137