簡體   English   中英

Haskell-以奇怪的方式組成三個函數

[英]Haskell- composing three functions in weird way

我有三個函數xyz和一個名為functionComposer的函數。

我希望functionComposer將函數xyz作為參數,並返回一個函數,該函數使用y和z的結果作為x的參數並應用x。

在數學符號中: x(y(a),z(b))

我不是要求這個: functionComposer xyz = xyz

例如:

double x = x + x

summer x y = x + y

functionComposer summer double double = summer (double) (double) 

如果x = 2,結果應為8(2 + 2)+(2 + 2)

你也可以使用(->) a的應用實例

import Control.Applicative


funcComp summer double1 double2 = summer <$> double1 <*> double2

或monad實例

funcComp summer double1 double2 = liftM2 summer double1 double2

理解這一點的方法是,對於(->) a ,applicative和monad實例都是為了“參數化” double1double2都接受的函數值。

使用你的符號:

functionComposer summer double1 double2 = \x -> summer (double1 x) (double2 x) 

\\x -> ...表示將x映射到...的函數。

注意我必須給double函數參數賦予不同的名稱,因為通常你想要組合不同的函數。

不管怎樣,我覺得好像你想要一系列令人困惑的點,所以:

functionComposer :: (c -> d -> e) -> (a -> c) -> (b -> d) -> a -> b -> e
functionComposer x y z = (. z) . (x . y)

這是“自然地”來自

functionComposer x y z a = (x . y) a . z

但為何停在那里?

functionComposer x y = (. (x . y)) . flip (.)

不再:

functionComposer x = (. flip (.)) . flip (.) . (x .)

更多!

functionComposer = (((. flip (.)) . flip (.)) .) . (.)

你基本上是在評估yz “並行1 ”。 表達這個的最基本的組合是(***) :: Arrow f => fac -> fbd -> f (a, b) (c, d) 你想要提供給x ,所以基本上你想寫

           x . (y***z)            -- or  x <<< y***z

現在這並沒有完全解決問題,因為箭頭組合器與元組一起工作。 所以你需要uncurry x 大致相同的方式,如果你想讓整個事物以正常的方式接受論證,那么你必須討論(a,b)元組。 雖然很容易:

functionComposer :: (c -> d -> e) -> (a -> c) -> (b -> d) -> a -> b -> e
functionComposer x y z = curry $ uncurry x <<< y *** z

1介意,我不是指多線程意義上的並行,只是“語義平行”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM