Haskell咖喱

Raz*_*iuc 0 haskell functional-programming currying

在过去的两个小时中,我一直在阅读有关Haskell中的currying的信息,所有资源都介绍了具有多个参数的函数实际上是如何返回其他函数的,而不是其定义的样子,所以这就是问题所在。

让我们定义函数:

myFunc :: (Num a) => a -> a -> a
myFunc x y = x * 2 + x * y
Run Code Online (Sandbox Code Playgroud)

:t (myFunc 2)打印Num a => a -> a,即接受数字并输出数字的函数。但是,由返回的函数的定义是什么(myFunc 2)样的?编译器会代替x定义,新函数变成类似myFunc' y = 2 * 2 + 2 * y吗?

递归如何处理currying?如果我定义功能

replicate' :: (Integral i, Ord i) => i -> a -> [a]
replicate' n x
    | n <= 0    = []
    | otherwise = x : replicate' (n - 1) x
Run Code Online (Sandbox Code Playgroud)

(replicate' 3)在上下文中返回的函数是什么(replicate 3) 'a'

eps*_*lbe 5

我认为您正在混淆两件事

  • 弯曲的
  • 部分功能应用

第一个是

                      ------currying-----> 
       f :: (a,b) -> c                      f' :: a -> b -> c
                      <----uncurrying-----
Run Code Online (Sandbox Code Playgroud)

将一个采用一个元组参数的函数转换为一个将两个参数组合在一起的参数-转换为一个需要一个参数并产生一个函数的函数!

如果您熟悉线性代数,则非常类似于将双线性函数视为生成另一个线性函数的线性函数。

而部分函数的应用只是显式括号的结果。

f :: a -> b -> c
Run Code Online (Sandbox Code Playgroud)

是真的

f :: a -> (b -> c)
Run Code Online (Sandbox Code Playgroud)

至少以haskell的方式定义函数。