【问题标题】:Applying a function to an arbitrarily long list of arguments将函数应用于任意长的参数列表
【发布时间】:2010-05-10 03:50:38
【问题描述】:

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

我在想这样的事情:

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

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

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

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

【问题讨论】:

    标签: haskell typeclass variadic function-composition


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以用一些花哨的类型类来做到这一点

      {-# 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]
      

      【讨论】:

      • 只需要 FlexibleInstances 就可以绕过整个 IsInt 类,直接写 ApplyType (Int -> r)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多