Haskell学习笔记: 变态的「$」函数

有多少种写法来计算3除以4的值?
在变态的$函数上柯里化,再加上Haskell支持前缀以及中缀表示法,可以衍生出无数种写法。

Prelude> (/4) 3
0.75
Prelude> (/4) $ 3
0.75
Prelude> ($ 3) (/4)
0.75
Prelude> ($ 3) $ (/4)
0.75
Prelude> fmap ($ 3) (Just (/4))
Just 0.75
Prelude> ($) (/4) 3
0.75
Prelude> ($) (/4) $ 3
0.75
Prelude> (3/) 4
0.75
Prelude> (/) 3 4
0.75
Prelude> (/) 3 $ 4
0.75
Prelude> (3/) $ 4
0.75
Prelude> ($ 4) $ (3/)
0.75
Prelude> ($ 4) (3/)
0.75
Prelude> ($) (3/) 4
0.75
Prelude> ($ (/4)) $ ($ 3)
0.75
Prelude> ($ (/4)) ($ 3)
0.75
Prelude> ($) ($ 3) (/4)
0.75
Prelude> let func = ($ (/4)) id
Prelude> func 3
0.75

一般对$函数原型的理解是第一个参数是函数,第二个参数是为该函数提供操作数据。这种理解虽然不错,但很容易落入第二个参数只能是数字或list等纯数据的思维定势。

Prelude> :t ($)
($) :: (a -> b) -> a -> b

$函数的第二个参数可以是任何类型,haskell中函数也是一种数据类型,也能成为参数!
像表达式

($) ($ 3) (/4)

,谁是函数谁是参数?已经完全和

($) (/4) 3

反了过来。
($ 3)这个函数,它接受函数(/4)为参数,把3作为参数提供给(/4)并执行,最后返回(/4)的执行结果。

「$」的柯里化和中缀就是这么变态

  1. 2012年9月29日 10:11 | #1

    好专业的分享,来学习一下

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: