应用风格的计算成本

Vag*_*rdi 10 haskell applicative

我在我的网络应用程序中使用一个小型数据库池.而这个特殊的功能:

withPool pool = bracket (takeConn pool) (putConn pool)
Run Code Online (Sandbox Code Playgroud)

可以用应用风格重写:

withPool = bracket <$> takeConn <*> putConn
Run Code Online (Sandbox Code Playgroud)

可以说,它同样可读,更优雅.很自然地,我想这样写.但是数据库连接池应该很快,我担心这种风格会带来不必要的开销.

所以我的问题是,在Haskell中使用应用函子有多少开销(如果有的话)?有没有基准?

Amo*_*son 19

我真的怀疑在大多数情况下他们会被编译成同样的东西.我做了一个很小的测试,

import Control.Applicative

test1 :: (b -> b -> c) -> (a -> b) -> (a -> b) -> a -> c
test1 bracket takeConn putConn pool = bracket (takeConn pool) (putConn pool)

test2 :: (b -> b -> c) -> (a -> b) -> (a -> b) -> a -> c
test2 bracket takeConn putConn = bracket <$> takeConn <*> putConn
Run Code Online (Sandbox Code Playgroud)

但我只限制test2的类型只有函数(这不是它最通用的类​​型,对..?)

然后我编译了ghc -O -ddump-simpl以获得GHC的某种中间输出(我尝试了C输出,它太难看了)两个看起来完全一样,除了名字.

(我也尝试过没有-O,但它们不一样,也没有遗漏类型注释)


小智 12

如果你担心这种微优化水平,你应该手动组装.

首先要写出清晰优雅的代码.如果速度是一个问题,请进行一些分析并优化热点.

鉴于Monad(( - >)r)的定义有多简单,你真的应该相信GHC为你定义内容,此时两个版本在alpha重命名时变得相同.