元组和功能组成

时间:2012-01-24 20:02:35

标签: haskell tuples function-composition

有没有更好的方法来表达(\(a, b) -> a < b)的功能组合?我觉得我错过了一些东西,试验curry只会让我更加困惑。

2 个答案:

答案 0 :(得分:12)

curry在这里使用是错误的;它将一个在元组上运行的函数转换为一个curry函数。你想要相反的,uncurry

uncurry :: (a -> b -> c) -> (a, b) -> c

在这种情况下,它是uncurry (<)

(用于在元组上编写函数的组合器的另一个有用来源是Control.Arrow;由于(->)Arrow的实例,因此您可以将a b c读作{{1} }}。)

答案 1 :(得分:1)

查看类型是Haskell获得第一个想法的最佳方式,任何函数的作用:

curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> (a, b) -> c

curry:对的函数→curried函数(curries函数)。

uncurry:curried function→pair的功能。

  

Haskell Wiki page on currying在页面末尾有一些小练习:

     
      
  • 简化curry id
  •   
  • 简化uncurry const
  •   
  • 使用sndcurry以及其他基本的Prelude功能和没有lambdas来表达uncurry
  •   
  • 编写没有lambda的函数\(x,y) -> (y,x),只使用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)