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])
有没有一种独立于参数数目的通用方法?
并不是的; 至少这是不值得的。首先,整个想法不是很有用,因为列表是同质的:所有元素必须具有相同的类型,因此它仅适用于仅采用单一类型参数的函数的非常特殊的特殊情况。
即使那样,问题还是在于,“数量的参数”在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
也可以使用类型族或多参数类型类使此方法适用于任何类型的参数。然而,不是那么简单的就是用可变类型的最终结果一劳永逸地编写它。原因是,这还必须将函数作为最终结果的类型来处理。但是,这也可以解释为“我们仍然需要在列表中添加一个参数”!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句