2010-05-10 88 views
2

我想創建一個函數apply,它接受一個具有任意數量參數的函數以及一個整數列表,並返回函數的結果(其中每個整數in該列表是爲了爭論將函數應用於任意長度的參數列表

我的想法是這樣的:

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)。 – 2010-05-10 17:11:43

11

我想創建一個功能應用是需要與參數的任意數量以及整數列表的功能做到這一點,

你爲什麼要這樣做?也許你的參數結構應該作爲一個數據結構來傳遞,但到目前爲止,你已經過度地限制了這個問題,以確保它不會產生一個慣用的Haskell解決方案。