在Haskell中,我们使用术语"section"来表示在中缀位置使用的部分应用函数.例如,对于一个函数foo :: a -> b -> c和值x :: a和y :: b,我们有两节
s1 = (x `foo`) :: b -> c == \b -> foo x b
Run Code Online (Sandbox Code Playgroud)
和
s2 = (`foo` y) :: a -> c == \a -> foo a y
Run Code Online (Sandbox Code Playgroud)
在类别理论,然而,一个段g的f定义为一个右逆f(以便f . g == id).
我没有看到两个定义之间有明显的联系.例如,s1显然不是反向foo,至少不是在Hask中.我想s1甚至不必在Hask中有反转.
类别理论定义是否是Haskell定义的来源,如果是,如何?
给定一些函数 f(x1,x2,x3,..,xN),在几个地方部分应用它通常很有用。例如,对于 N=3,我们可以定义 g(x)=f(1,x,3)。然而,Haskell 中的标准部分应用程序不是这样工作的,它只允许我们通过固定它的第一个参数来部分应用一个函数(因为所有函数实际上只接受一个参数)。有没有什么简单的方法可以做这样的事情:
g = f _ 2 _
g 1 3
Run Code Online (Sandbox Code Playgroud)
输出值f 1 2 3? 当然我们可以做一个 lambda 函数
g=(\x1 x3 -> f x1 2 x3)
Run Code Online (Sandbox Code Playgroud)
但我觉得这很不可读。例如,在 Mathematica 中,它是这样工作的,我觉得这很好:
g=f[#1,2,#2]&
g[1,3]
Run Code Online (Sandbox Code Playgroud)
与输出f[1,2,3]。
编辑:也许我应该多谈谈动机。我想在点式组合中使用这种部分应用的函数,即在这样的表达式中:
h = g. f _ 2 . k
Run Code Online (Sandbox Code Playgroud)
得到h 3 = g(f(k(3),2))。
在哈斯克尔(Haskell),碰巧一切都是咖喱。所有函数都只使用一个参数(甚至Haskell中未使用的函数也使用一个元组,严格来说,这是一个参数-您可能需要使用curry和uncurry函数来查看其工作原理)。
我不确定这是否是正确的,但可以这样假设。
如果一个函数采用另一个函数作为参数,它的咖喱化或不咖喱化与采用不带元组或列表参数的函数类似?(一对元组类型是type1 x type2并且可以是type1^2,而函数类型是type2^{type1},所以我发现它们相似)
如果是未咖喱的,如何将这样的功能转换为咖喱的功能?