有更好的方法来表示(\(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函数