【问题标题】:Example of deep understanding of currying深入理解柯里化的例子
【发布时间】:2016-07-14 09:50:15
【问题描述】:

阅读https://wiki.haskell.org/Currying

它说:

很多时候,新程序员可以忽略柯里化。这 将所有函数视为 curried 的主要优点是 理论上的:当所有函数都被处理时,形式化证明更容易 一致(一个参数输入,一个结果输出)。话虽如此,有 是您需要了解的 Haskell 习语和技术 咖喱。

什么是需要更深入地理解柯里化的 Haskell 技术/习语?

【问题讨论】:

  • 应用函子是柯里化如何影响惯用 Haskell 的一个很好的例子。 Applicative<*> 方法是在 f (a -> b) 上定义的,它是一个参数函数的函子,但是由于所有函数都是柯里化的,所以 all 函数都是一个参数,所以 <*>函数适用于任意数量的函数。
  • flip id的类型是什么?它有什么作用?
  • 也许需要最深刻的理解才能理解像printf 这样的疯狂事物,但我不建议你直接跳入那种复杂性。
  • 柯里化看起来像一些简单的语法级快捷方式。但它实际上允许您迭代任意数量的函数参数。这就是(例如)QuickCheck 能够透明地测试 N 元函数的方式。

标签: haskell currying


【解决方案1】:

部分函数应用程序并不是 Haskell 的一个真正独特的特性。这只是柯里化函数的结果。

map :: (a -> b) -> [a] -> [b]

在像 Python 这样的语言中,map总是有两个参数:a -> b 类型的函数和[a] 类型的列表

map(f, [x, y, z]) == [f(x), f(y), f(z)]

这要求您假装-> 语法只是为了展示,而(a -> b)[a] 之间的->[a] -> [b] 之间的语法并不完全相同。然而,事实并非如此;它是 exact 相同的运算符,并且是右关联的。 map 的类型可以显式括起来为

map :: (a -> b) -> ([a] -> [b])

突然之间,您可能只给map 一个参数(函数)并返回一个[a] -> [b] 类型的 函数,这似乎变得不那么有趣了。这就是所有偏函数的应用:利用所有函数都被柯里化的事实。

事实上,你永远不会给一个函数提供多个参数。为了配合-> 是右关联的,函数applicationleft-关联的,这意味着像“多参数”调用

map f [1,2,3]

真的是两个函数应用,加括号就更清楚了。

(map f) [1,2,3]

map 首先“部分”应用于一个参数f,它返回一个新函数。 这个函数然后应用到[1,2,3]得到最终结果。

【讨论】:

  • 很好的答案。 map 示例可能是一个人并不真正需要了解正在发生的柯里化的情况。部分函数应用程序确实需要理解柯里化的一个例子是,例如filter (== 5) 其中(==) :: Eq a => a -> a -> Bool(==) 5 :: Eq a => a -> BoolsortBy (comparing f) 其中comparing :: Ord a => (b -> a) -> b -> b -> Orderingcomparing f :: b -> b -> OrderingsortBy (comparing f) :: [b] -> [b]
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2018-04-18
相关资源
最近更新 更多