haskell的 函式組合 是怎麼實現的,scala裡如何做到?

時間 2021-06-03 18:40:13

1樓:夏梓耀

compose[A

](g:A

=>T1)

:A=>R=

Haskell的話,還是個函式:(.

)::(b

->c)

->(a

->b)

->(a

->c)

f.g=

\x->f(

gx)那麼在Scala裡也可以這麼搞(假設可以用implicit):

scala

>implicit

class

JoinFunctionsCompactly

[B,C](g

:B=>C)

defined

class

JoinFunctionsCompactly

scala

>valmul3

:Int

=>Int=_*

3mul3

:Int

=>Int=

>scala

>valplus1

:Int

=>Int=_+

1plus1

:Int

=>Int=

>scala

>valx

=mul3

oplus1x:

Int=>

Int=

>scala

>x(1)res0

:Int=6

scala

>valy

=plus1

omul3y:

Int=>

Int=

>scala

>y(1)res1

:Int=4

可問題是為毛Scala沒這麼搞叻?包括之前的那個問題scala中有類似haskell裡面$符號的語法糖嗎? - Scala,我在回答裡也給出了解決方案,但是為毛Scala標準庫里沒有$叻?

因為Haskell的函式是預設柯里化的,而Scala不是,Scala裡大部分函式是多參的,應用不廣。

scala

>valplus:(

Int,

Int)

=>Int=_+

_plus:(

Int,

Int)

=>Int=

>scala

>pluso((

_:Int)*

3)

>:10:

error:

valueois

nota

memberof(

Int,

Int)

=>Intpluso((

_:Int)*

3)^沒人願意這樣寫函式的:

scala

>valpls

:Int

=>Int=>

Int=(x

:Int

)=>(y

:Int

)=>x+

ypls

:Int

=>(Int

=>Int)

=

>scala

>plso

mul3

res14

:Int

=>(Int

=>Int)

=

>scala

>res14(2

)(1)res16

:Int=7

//或顯示柯里化

scala

>plus

.curriedo((

_:Int)*

3)res17

:Int

=>(Int

=>Int)

=

>其次,Scala的方法,不是函式,只有函式才可以compose,如果方法想組合,就得先用「_」(部分應用)轉為函式,甚是麻煩,相比方法鏈式呼叫,後者優雅的多

這一段內容文不答題,作為擴充套件閱讀吧

(.)邏輯上理解是 -> r Functor的fmap

instance

Functor

((->)r

)where

fmap=(

.)基於這個事實,在Scala裡也可以這麼搞:

(((_:

Int)*3

)compose

((_:

Int)+1

))(2

)// 9

(((_:

Int)+1

)map

((_:

Int)*3

))(2)//

9更多變體:scalaz/ArrowUsage.scala at ea856759e60d0d3fbf2becc7b4e1918ecdf70085 · scalaz/scalaz · GitHub

(還有->做為Profunctor做函式組合:scalaz/Arrow.scala at ea856759e60d0d3fbf2becc7b4e1918ecdf70085 · scalaz/scalaz · GitHub

注:會先隱式將Scala函式lift成=>:型別)

implicit 不要。。。Scala玩不起來了,散了吧

Haskell的函式式和Scheme的函式式和Clojure的函式式有什麼區別嗎?

Haskell Typed,call by name Lambda calculus Scheme Untyped,call by value lambda calculus Untyped 和 Typed 區別就在於同樣 partial function 的表達 untyped add x y i...

函式及陣列的基本解析

中信公升級白金卡,是不會提額的。因為額度都是共享的,不管你公升級白金卡,年費是多少,那麼額度都是不會變化的。中信的白金卡權益還是比較不錯的,而且根據年費不同,白金卡的等級也不同。所以公升級白金卡,需要考慮兩個問題,第一 白金卡的權益,自己是否需要?第二 白金卡的年費,自己能否接受?這兩個問題才是你需...

陣列做函式引數的退化問題,請問是怎麼回事呢?

1.首先明白編譯器將陣列退化為指標的場景,以下三種情況是不會退化為指標的 char s hello 此時對 s 進行取位址操作,還是使用的陣列首元素,而不是首元素的位址 即 s s 0 1.2 作為常量字串進行初始化賦值的時候 char s hello 此時的 hello 表示的是陣列,而不是指標 ...