繁体   English   中英

找到Haskell函数f,g使得fg = f。 G

[英]Find Haskell functions f, g such that f g = f . g

在学习Haskell时,我遇到了一个挑战,找到两个函数fg ,比如fgf . g f . g是等价的(总和,所以f = undefinedf = (.) f不算数)。 给定的解决方案是fg都等于\\x -> x . x \\x -> x . x (或join (.) )。

(我注意到这不是Haskell特有的;它可以用纯组合逻辑表示为“找到fg使得fg = B fg ”,然后给定的解将转换为f = g = WB 。)

我明白为什么给定的解决方案在扩展时会起作用,但我不明白你如何找到它,如果你还不知道的话。 这是我能走多远:

  • fg = f . g fg = f . g (给定)
  • fgz = (f . g) z (双方的fgz = (f . g) z扩张)
  • fgz = f (gz) (简化RHS)

而且我不知道如何从那里开始。 在尝试寻找解决方案时,我会做什么?

我发现通过考虑教会数字计算可以找到一系列解决方案。 在教会编码中,通过组合教会数字来执行乘法,并且通过将基数应用于指数来执行取幂。 因此,如果f是某个数字x的Church编码,并且g是某个数字y的Church编码,则fg = f . g fg = f . g表示y^x = x*y 该等式的任何非负整数解都转化为原始问题的解。 例子:

  • x=1, y=0, f=id, g=const id
  • x=1, y=1, f=id, g=id
  • x=1, y=2, f=id, g=join (.)
  • 由于对于所有yy^1 = y = 1*y ,因此f=id适用于所有教会数字g是有意义的。 这的确是这样的,而事实上,正如雷恩Henrichs指出,这是适用于所有g ,而这是通过检查容易证实。
  • x=2, y=0, f=join (.), g=const id
  • x=2, y=2, f=join (.), g=join (.)
  • x=3, y=0, f=(.) <*> join (.), g=const id
  • 由于对于所有正x0^x = 0 = x*0 ,因此g=const id适用于所有正数教会数字f (它不适用于f=const id ,教会数字0,这是有道理的,因为0^0是一个不确定的形式。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM