有没有更好的方法来表达(\(a, b) -> a < b)
函数组合?我觉得我错过了一些东西,而尝试curry
只会让我更加困惑。
问问题
938 次
2 回答
12
curry
在这里使用是错误的;它将对元组进行操作的函数转换为柯里化函数。你想要相反的,那就是uncurry
:
uncurry :: (a -> b -> c) -> (a, b) -> c
在这种情况下,它是uncurry (<)
.
(用于在元组上编写函数的组合器的另一个有用来源是Control.Arrow
; 因为(->)
它是 的一个实例Arrow
,所以您可以读a b c
为b -> c
。)
于 2012-01-24T20:06:04.970 回答
1
查看类型是 Haskell 中获得第一个想法的最佳方法,即任何函数的作用:
curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> (a, b) -> c
curry
: 对的函数 → 柯里化函数(它柯里化一个函数)。
uncurry
: 柯里化函数 → 对函数。
Haskell Wiki page on currying在页面末尾有一些小练习:
- 简化
curry id
- 简化
uncurry const
snd
使用curry
or和其他基本Preludeuncurry
函数且不使用 lambda 表达式- 编写
\(x,y) -> (y,x)
不使用 lambda 且仅使用 Prelude 函数的函数立即尝试解决这些练习,它们将使您深入了解 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)
于 2015-02-19T22:50:42.560 回答