2010-05-10 2 views
2

Я хочу создать функцию apply, которая принимает функцию с произвольным количеством аргументов, а также список целых чисел и возвращает результат функции (где каждое целое число в список является аргументом для тогоПрименение функции к произвольно длинному списку аргументов

Я думал, что-то вроде:

apply :: ([Int] -> Int) -> [Int] -> Int 
apply f x:xs = apply (f x) xs 
apply f [] = f 

Но я знаю, что это не будет работать, так как тип подписи неправильно - функция не принимает список Интс. , он просто принимает некоторое количество аргументов int.

Кроме того, когда я добираюсь до базового случая, аргумент f для применения должен фактически быть целым числом, в любом случае нарушая подпись типа.

Кто-нибудь знает, как справиться с этой проблемой?

ответ

7

Вы можете сделать это с некоторым фантазией типа классов

{-# LANGUAGE FlexibleInstances #-} 
-- for ApplyType (Int -> r) 

class ApplyType t where 
    apply :: t -> [Int] -> Int 

instance ApplyType Int where 
    apply f _ = f 

instance (ApplyType r) => ApplyType (Int -> r) where 
    apply f (x:xs) = apply (f x) xs 

main :: IO() 
main = do print $ apply ((+) :: Int->Int->Int) [1, 2] 
      print $ apply ((\x y z w -> x*y - z`div`w) :: Int->Int->Int->Int->Int) [3,5,8,2] 
+1

Вам просто нужно FlexibleInstances, и вы можете обойти весь класс IsInt и написать ApplyType (Int -> r) напрямую. –

11

Я хочу создать функцию применить которая принимает функцию с произвольным количеством аргументов, а также списком целых чисел,

Зачем вы хотите это сделать? Возможно, ваша структура аргументов должна быть передана как структура данных, но до сих пор вы уже сдерживали проблему, чтобы гарантировать, что она не будет создавать идиоматическое решение Haskell.

Смежные вопросы