Текущая функция curry принимает функцию, принимающую кортеж из 2-х элементов и позволяющая результирующей функции быть нарисованной или частично примененной.Haskell, возможно ли создать функцию карри, которая может каррировать любое количество элементов кортежа.
let x = curry (\(x, y) -> x + y)
x 1 2 -- 3
Возможно ли создать функцию карри, которая может работать с функциями, которые имеют N элементов в своих кортежах?
Я попытался создать его, но я не уверен в сигнатуре типа 1: и 2: как изменить параметры.
curryN f 0 = f
curryN f n = \a -> (curryN (f) (n-1)) a
curryN (\(x, y, z) -> x + y + z) 3
-- I assume it looks something like: \a -> (\a -> (\a -> (f) a) a) a but I'm not sure
ИЛИ
curryN f 0 = f
curryN f n = curryN (\a - > f a) (n -1)
На стороне записки, может такая функция, то обнаружить количество элементов, а не необходимости быть сказано, что это число?
Если 'n' является статически известным (например, с прокси-номером или типом уровня), это прекрасное упражнение для семейств типов. См. [Uncurry for n-arry functions] (http://stackoverflow.com/questions/24843224/uncurry-for-n-ary-functions). Использование вложенных пар вместо n-кортежей должно допускать рекурсивное решение. – chi
Не в стандартном Haskell (например, Haskell 98 или Haskell 2010). –
Связанные: https://ro-che.info/articles/2013-01-29-generic-uncurry –