【问题标题】:Function composition partial application功能组合部分应用
【发布时间】:2018-06-13 14:31:38
【问题描述】:

你好,有人可以向我解释这个来自 Real World Haskell 的函数组合示例:

data Doc = ToBeDefined deriving (Show) 

(<>) :: Doc -> Doc -> Doc
a <> b = undefined

series :: Char -> Char -> (a -> Doc) -> [a] -> Doc
series open close item = enclose open close
                         . fsep . punctuate (char ',') . map item
                         -- Who does fsep compose with?

enclose :: Char -> Char -> Doc -> Doc
enclose begin end input = char begin <> input <> char <> end

我不明白. fsep 表达式的正确操作数是谁。

( . ) [who is here ]  fsep 

因为从外观上看,关闭和打开只是一个字符。你能用数据类型(在我们的例子中是一个字符)组成一个函数吗?

P.S 是否可以对函数组合进行柯里化?

所以enclose接受3个参数:其中2个已经固定open和close,第三个是fsep的结果。

基本上你可以做到f(x1...xn-1 xn) . g(y1....yn)(k),只要g(y1...yn)(k)=xn。

【问题讨论】:

  • 这实际上是左操作数。
  • . 就像任何其他运算符一样。 f . g == (.) f g,你可以定义像(f .)和(. g)这样的部分。
  • “是否可以对函数组合进行柯里化”是什么意思?
  • 我认为给定一个函数f 和一个函数g 他们都必须接受一个参数。在这种情况下,它更像f 接受3个参数,其中2个已经固定并且1 取自 g x - 其中 x 是第三个参数。
  • (到你问题的最后一句话:)不,你可以做( f(x1...xn-1) . g(y1...yn) ) (k),只要g(y1...yn)(k) = xn。 ---- 另外,应该是enclose begin end input = char begin &lt;&gt; input &lt;&gt; char end。

标签: haskell function-composition pointfree


【解决方案1】:

这里没有什么令人兴奋的事情。你引用的函数只是

series open close item = enclose open close . fsep . punctuate (char ',') . map item

在enclose open close 之后有一个换行符以提高可读性(这不会​​改变它的解析方式)。 IE。您询问的. 的操作数是enclose open close 和fsep†。

这里,enclose open close 是enclose 函数的部分应用:

enclose :: Char -> Char -> Doc -> Doc
enclose open   ::  Char -> Doc -> Doc
enclose open close   ::    Doc -> Doc

因此,您要在产生 Doc 的函数之前编写 Doc -&gt; Doc 函数。


†实际上,这在技术上并不完全正确:因为. 是正确-关联的,所以正确的操作数实际上是其右侧的所有内容 ,即

     (enclose open close) . (fsep . punctuate (char ',') . map item)

但由于f . (g . h) ≡ (f . g) . h,这并不重要。

【讨论】:

  • 哦,但我认为在无点表示法中你不能有 f(p1,p2,p3) 。 g(p4,p5,p6) p7.我的意思是你可以在同一个公共参数上组合函数,但方法也可以有其他参数?
  • 我不确定我是否理解您的问题(也许您应该将其充实到一个单独的问题中),但通常,您可以部分应用任意数量的参数。如果f :: A -&gt; B -&gt; C 和g :: D -&gt; E -&gt; B,那么你可以写f a . g d $ e 而不是f a (g d e)。
  • 谢谢你,这是我需要理解的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2011-03-30
  • 1970-01-01
  • 2012-05-01
  • 2016-04-04
  • 2021-03-03
相关资源
最近更新 更多