Haskell 将函数应用于任意长的参数列表

Haskell 将函数应用于任意长的参数列表,haskell,typeclass,variadic,function-composition,Haskell,Typeclass,Variadic,Function Composition,我想创建一个函数apply,它接受一个具有任意数量参数和整数列表的函数,并返回函数的结果(其中列表中的每个整数都是按顺序排列的参数) 我的想法是: apply :: ([Int] -> Int) -> [Int] -> Int apply f x:xs = apply (f x) xs apply f [] = f 但是我知道这不起作用,因为类型签名是错误的-函数不接受int列表,它只接受一些int参数 此外,当我谈到基本情况时,要应用的f参数实际上应该是一个整数,无论如何都

我想创建一个函数apply,它接受一个具有任意数量参数和整数列表的函数,并返回函数的结果(其中列表中的每个整数都是按顺序排列的参数)

我的想法是:

apply :: ([Int] -> Int) -> [Int] -> Int
apply f x:xs = apply (f x) xs
apply f [] = f
但是我知道这不起作用,因为类型签名是错误的-函数不接受int列表,它只接受一些int参数

此外,当我谈到基本情况时,要应用的f参数实际上应该是一个整数,无论如何都会违反类型签名


有人知道如何处理这类问题吗?

您可以使用一些奇特的类型类

{-# 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]
我想创建一个函数apply,它接受一个具有任意数量参数和整数列表的函数


为什么要这样做?也许您的参数结构应该作为数据结构传递,但到目前为止,您已经过度约束了问题,以确保它不会产生惯用的Haskell解决方案。

您只需要FlexibleInstances,就可以绕过整个IsInt类,直接编写ApplyType(Int->r)。