2017-06-28 107 views
0

在Haskell的函數組合操作定義爲:我可以在Haskell中創建我自己的函數組合運算符嗎?

(.) :: (b -> c) -> (a -> b) -> a -> c 

當我試圖創建自己的函數組合操作,o在Haskell,這是行不通的,我究竟做錯了什麼?

o :: a -> (a -> b) -> (b -> c) -> c 

g :: Double -> String 
g x = show x 

h :: Int -> Double 
h x = fromIntegral x 

f :: Int -> String 
f x = o x h g  -- can it also be written like this: f = o h g 

錯誤消息:

C:\Users\August\Desktop\Haskell\Template\Ex.hs:36:1: error: 
    The type signature for `o' lacks an accompanying binding 
Failed, modules loaded: none. 
+1

一點也沒有」 t的工作原因正是錯誤消息所說的:你爲'o'寫了一個類型簽名,但沒有寫出像'oxfg = g(fx)'這樣的定義。 –

回答

2

你的功能o是非常相似的函數組合.

(.) :: (b -> c) -> (a -> b) -> a -> c 
f . g = \x -> f (g x) 

你可以重寫的.的定義,只是略微修改參數:

o :: a -> (a -> b) -> (b -> c) -> c 
o x f g = g (f x) 

或者你可以嘗試通過各地的.參數洗牌創造o

o = (flip .) . flip . (flip .) $ (.) 

在這個定義中,我們使用flip交換的(.)第一和第二個參數和(flip .)交換第二和第三個論點。對於功能a -> b -> c -> d,這將使我們:

a -> b -> c -> d 
-- swap b and c with (flip .) 
a -> c -> b -> ->d 
-- swap a and c with (.) 
c -> a -> b -> -> d 
-- swap a and b 
c -> b -> a -> d with (flip .) 

如果你想知道爲什麼(flip .)交換的第二個和第三個參數,我建議您閱讀this answerthe blog post that was linked in it。它歸結爲.確保flip得到適用於您傳遞給(flip .)的任何函數的結果,並交換函數結果的第一個和第二個參數與交換其第二個和第三個參數相同。


老實說,雖然,我沒有看到你的o功能的需要,因爲你可以只改寫f爲:

f :: Int -> String 
f x = g . h $ x 

甚至

f = g . h 
相關問題