【问题标题】:Tuple and function composition元组和函数组合
【发布时间】:2012-01-24 20:02:34
【问题描述】:

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

【问题讨论】:

    标签: haskell tuples function-composition


    【解决方案1】:

    curry 在这里用错了;它将对元组进行操作的函数转换为柯里化函数。你想要相反的,那就是uncurry

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

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

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

    【讨论】:

      【解决方案2】:

      查看类型是在 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
      • 使用 curryuncurry 和其他基本 Prelude 函数表达 snd,不使用 lambdas
      • 编写函数\(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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多