Haskell «Применить»? [Дубликат]
Possible Duplicate:
Why is such a function definition not allowed in haskell?
Я новичок в мире Haskell, мигрирующий из Lisp. Я пытаюсь приспособиться к принципиально другому мировоззрению Хаскелла, и одна из многих вещей, которые я нахожу новым и интересным, - это система типов. Будучи Лиспером, я подумал, что попытаюсь реализовать в Haskell функцию, которая очень важна в мире Лисп:apply
, Для тех, кто не знает, apply принимает функцию и список аргументов и вызывает функцию для этих аргументов. На схеме(apply + '(1 2 3))
так же, как вызов(+ 1 2 3)
и возвращает 6.
Мой код на Haskell выглядит примерно так:
apply x [] = x
apply f (x:xs) = apply (f x) xs
Но Хаскелл жалуется:
ERROR line 2 - Type error in function binding
*** Term : apply
*** Type : (b -> a) -> [b] -> a
*** Does not match : a -> [b] -> a
*** Because : unification would give infinite type
И я думаю, что понимаю почему. Тип приложения должен отличаться в зависимости от длины списка, который ему дан. Учитывая список, скажем, 3 элементов, тип применения должен быть следующим:(a -> a -> a -> b) -> [a] -> b
, но учитывая список из 6 элементов, тип применения должен быть:(a -> a -> a -> a -> a -> a -> b) -> [a] -> b
.
Я попробовал этот ужасный обходной путь:
data FnOrDat a b = Dat b | Fn (a -> FnOrDat a b)
apply :: (FnOrDat a b) -> [a] -> (FnOrDat a b)
apply x [] = x
apply (Fn f) (x:xs) = apply (f x) xs
apply (Dat _) _ = error "Cannot apply something which is not a function!"
add a = Fn (\b -> Dat (a + b))
main = putStrLn $ show $ x where Dat x = apply (Fn add) [5,1]
Это работает, но вряд ли считаетсяapply
функция, потому что я не могу пройтиapply
нормальная функция, я должен использовать ту, которая была написана специально для использования моей (неудобной) абстракции FnOrDat. Если бы я хотел написать функцию, которая добавила бы четыре числа, мне нужно было бы написать
add4 a = Fn (\b -> Fn (\c -> Fn (\d -> Dat (a + b + c + d))))
Еа.
Итак - я что-то упускаю или спрашиваю для общего назначенияapply
в основном, как запросить функцию, которая может манипулировать кортежом произвольной длины? Есть лиapply
вообще имеет смысл в статически типизированном мировоззрении Хаскелла?