За последние два часа я читал о каррировании в Haskell, и все ресурсы показывают, как функции с несколькими параметрами фактически возвращают другие функции, но не так, как их определения выглядят, так что вот о чем идет речь ,Haskell Currying
Определим функцию:
myFunc :: (Num a) => a -> a -> a
myFunc x y = x * 2 + x * y
:t (myFunc 2)
печатает Num a => a -> a
, то есть функция, которая принимает число, а также выводит номер. Однако, как выглядит определение функции, возвращаемое (myFunc 2)
? Подходит ли компилятор x
в определении, а новая функция становится чем-то вроде myFunc' y = 2 * 2 + 2 * y
?
Как рекурсия обрабатывает карри? Если я определяю функцию
replicate' :: (Integral i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x : replicate' (n - 1) x
, что функция, возвращаемая (replicate' 3)
в контексте (replicate 3) 'a'
?
Не могли бы вы объяснить, что '\ x -> x: replicate '2 x' означает? Кроме того, компилятор рассматривает 'myFunc', как я догадался? –
Ум, вы знаете, как работают лямбда-функции, верно? В противном случае, это было бы хорошее время, чтобы прочитать их, они чрезвычайно важны. – leftaroundabout