将haskel中的所有函数参数作为列表

waw*_*awa 3 haskell

haskell中有没有办法将所有函数参数作为列表获取.

让我们假设我们有以下程序,我们想要添加两个较小的数字,然后减去最大的数字.假设,我们无法改变函数的定义foo :: Int -> Int -> Int -> Int.有没有办法将所有函数参数作为列表获取,而不是构造一个新列表并将所有参数作为所述列表的元素添加?更重要的是,是否存在一种独立于参数数量的一般方法?

例:

module Foo where
    import Data.List

    foo :: Int -> Int -> Int -> Int
    foo a b c = result!!0 + result!!1 - result!!2 where result = sort ([a, b, c])
Run Code Online (Sandbox Code Playgroud)

lef*_*out 6

这样做的一般方法是独立于参数的数量吗?

并不是的; 至少它不值得.首先,这个整个想法并不是很有用,因为列表是同构的:所有元素必须具有相同的类型,因此它只适用于仅采用单一类型参数的相当不寻常的特殊情况.

即便如此,问题在于"参数的数量"在Haskell中并不是一个明智的概念,因为正如Willem Van Onsem所评论的那样,所有函数实际上只有一个参数(实际上,其他参数实际上只给出了第一个应用的结果),又有功能型).

也就是说,至少对于单个参数和最终结果类型,将任意数量的参数打包到列表中非常容易:

{-# LANGUAGE FlexibleInstances         #-}

class UsingList f where
  usingList :: ([Int] -> Int) -> f

instance UsingList Int where
  usingList f = f []

instance UsingList r => UsingList (Int -> r) where
  usingList f a = usingList (f . (a:))

foo :: Int -> Int -> Int -> Int
foo = usingList $ (\[?,?,?] -> ? + ? - ?) . sort
Run Code Online (Sandbox Code Playgroud)

使用类型族或多参数类型类也可以使这个参数适用于任何类型的参数.虽然不是那么简单,但是用最终结果的可变类型一劳永逸地写出它.原因是,这也必须将函数作为最终结果的类型来处理.但是,那也可以解释为"我们仍然需要在列表中添加一个参数"!