有更好的方法來表示(\(a, b) -> a < b)
的函數組成嗎?我覺得我失去了一些東西,並試驗curry
只會讓我更困惑。元組和函數組合
Q
元組和函數組合
6
A
回答
12
curry
在這裏使用是錯誤的;它將一個在元組上運行的函數轉換成一個curried函數。你想反其道而行之,這是uncurry
:
uncurry :: (a -> b -> c) -> (a, b) -> c
在這種情況下,它的uncurry (<)
。
(用於在元組編寫函數有用的組合子的另一個有用來源是Control.Arrow
;因爲(->)
是Arrow
一個實例,你可以閱讀a b c
爲b -> c
)
1
在類型看是在Haskell的最佳途徑拿到第一個想法,任何的功能是什麼:
curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> (a, b) -> c
curry
:對→咖喱功能的功能(它curries函數)。
uncurry
:咖喱函數→函數對。
Haskell Wiki page on currying有小練習在頁面的末尾:
- 簡化
curry id
- 簡化
uncurry const
- 快遞
snd
使用curry
或uncurry
等基本前奏功能和不lambda表達式- 在沒有lambda和wi的情況下編寫函數
\(x,y) -> (y,x)
只有前奏功能試着立即解決這些練習,他們會給你一個大量的Haskell類型系統和函數應用的見解。
還有的uncurry
幾個有趣的應用程序,嘗試不同的參數傳遞給下面的功能,看看他們做了什麼:
uncurry (.) :: (b -> c, a -> b) -> a -> c
uncurry (flip .) :: (b -> a -> b1 -> c, b) -> b1 -> a -> c
uncurry (flip (.)) :: (a -> b, b -> c) -> a -> c
uncurry ($) :: (b -> c, b) -> c
uncurry (flip ($)) :: (a, a -> c) -> c
-- uncurry (,) is an identity function for pairs
uncurry (,) :: (a, b) -> (a, b)
uncurry (,) (1,2) -- returns (1,2)
uncurry uncurry :: (a -> b -> c, (a, b)) -> c
uncurry uncurry ((+), (2, 3)) -- returns 5
-- curry . uncurry and uncurry . curry are identity functions
curry . uncurry :: (a -> b -> c) -> (a -> b -> c)
(curry . uncurry) (+) 2 3 -- returns 5
uncurry . curry :: ((a, b) -> c) -> ((a, b) -> c)
(uncurry . curry) fst (2,3) -- returns 2
-- pair -> triple
uncurry (,,) :: (a, b) -> c -> (a, b, c)
uncurry (,,) (1,2) 3 -- returns (1,2,3)
相關問題
- 1. 斯卡拉元組函數組合
- 2. 數組函數的組合
- 3. SML函數和元組
- 4. 數組元素的組合
- 5. 拼合袋和元組的元組
- 6. C++組合組合高性能函數
- 7. Tupled函數組合
- 8. Boost函數組合
- 9. Haskell函數組合
- 10. 組合函數(AND)
- 11. 組合/合併php函數
- 12. PHP數組函數,差異和合並
- 13. 組合兩個數組的函數?
- 14. 數組陣列的組合函數
- 15. SML元組 - 組合
- 16. 組合數組元素,爲獲得數
- 17. 組組合和盡數
- 18. ocaml的函數需要元組和元組列表中返回一個元組
- 19. 將數組組合到元組數組中 - 奇數長度
- 20. 在Scala元組上使用函數組合器?
- 21. 組合數組和求和整數
- 22. 聚合函數和按問題分組
- 23. 幾個INDEX和MATCH函數的組合
- 24. 聚合函數的時間和組
- 25. 如何組合鏡頭和仿函數?
- 26. Haskell重寫規則和函數組合
- 27. Forloop變量和函數組合
- 28. 分組和按聚合函數
- 29. 子集和組合元素
- 30. 爲輸入和textarea元素組合js函數