2

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

我在想类似的事情:

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

但我知道这行不通,因为类型签名是错误的——该函数不采用 int 列表,它只需要一些 int 参数。

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

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

4

2 回答 2

11

我想创建一个函数 apply ,它接受一个带有任意数量参数的函数以及一个整数列表,

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

于 2010-05-10T05:05:40.520 回答
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]
于 2010-05-10T05:03:33.177 回答