【发布时间】:2017-12-26 01:15:22
【问题描述】:
我在 Haskell 中得到了一个谜题,
f有两个函数,函数a和函数b。函数a接受 na 输入并返回Num类型,函数b接受 nb 输入并返回Num类型。f返回一个新的 na+nb 函数,它将a应用于第一个 n a 个参数,nb 到其余参数并返回它们的总和。
在数学中我会这样写:
我在 Haskell 中第一次天真的尝试是:
f a b = flip ((+) . a) . b
但这只有在 a 是一元函数时才有效。
在这之后,我想了很久这个谜题,甚至无法想出我应该如何做到这一点的想法。这是很长时间以来我第一次对 Haskell 感到如此困惑。
我该如何解决这个难题?这个谜题有解决方案吗? (我的一个朋友给了我这个谜题,我不相信他们当时有真正的解决方案)
【问题讨论】:
-
我们可以在 Haskell 中举个例子吗,因为在 Haskell 中有两种解释 $f(a,b)$ 的方法(即你想要
f a b :: (Int,Int,Int) -> Int还是f a b :: Int -> Int -> Int?) -
采用
n_a输入的函数类型为Vec n_a X -> Y其中data Vec n a where Nil :: Vec 0 a; Cons ::a -> Vec n a -> Vec (1 + n) a。 -
@DanRobertson 严格来说,我们不知道
f a b有这两种类型,因为f a b可能接受任意数量的输入。但是我认为这个谜题的目的是为了一个柯里化函数,因为在 Haskell 中拥有一个任意大小的元组显然是不可能的。 (话虽这么说,以这种方式进行柯里化可能是不可能的,我只是不确定,因为我确信采用任意元组是行不通的) -
当然可以。我使用了一个任意示例来说明您是否想要柯里化或类似上面的
Vec或某种类型的同质元组列表混合。这样就搞定了。 -
@DanRobertson 这个谜题是按原样给我的,所以我会对这两种/任何类型的解决方案都感兴趣。柯里化很酷,但解决方案就是解决方案,我当然不会抱怨,因为我发现这个谜题很有趣,新的思维方式可能对我有好处。
标签: haskell functional-programming