如何在Haskell中将列表作为单个参数“解包”?

oro*_*ome 6 syntax haskell functional-programming parameter-passing

Haskell中是否有内置或惯用的方式来“解压缩”列表中的元素并将其视为函数的单独参数?

例如,如果我f :: a -> b -> c -> d -> e有一些紧凑的东西,例如

f (unlist x)
Run Code Online (Sandbox Code Playgroud)

完成

let x = [1,2,3,4] in f (x!!0) (x!!1) (x!!2) (x!!3) 
Run Code Online (Sandbox Code Playgroud)

或至少以一种“减少”(!!重复次数过多)的方式来解压缩通常已知长度的列表(这样,在这种情况下,它可以用作函数的参数)。


本质上,我正在寻找的东西类似于Sequence@@Mathematica:

f[Sequence@@{1, 2, 3, 4}]
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 6

它在Haskell类型系统中不是特别有用:

  1. 正如Mephy指出的那样,您需要为每个列表长度使用一个单独的函数,并且在运行时传递长度错误的列表时会失败;
  2. 所有参数必须具有相同的类型。

鉴于此,使用元组比使用列表更有意义,因为它避免了两个问题。标准库包括uncurry针对2个参数的函数执行此操作的类,您可以uncurry3类推定义,等等:

uncurry3                 :: (a -> b -> c -> d) -> ((a, b, c) -> d)
uncurry3 f (a, b, c)     =  f a b c
Run Code Online (Sandbox Code Playgroud)

  • 就目前而言还可以,但是一般来说,除非必要,否则尽量避免使用“ !!”。例如,使用模式匹配而不是`!!`来访问已知小索引处的元素:fabcd中的[let [a,b,c,d] = [1,2,3,4]。 (2认同)
  • @raxacoricofallapatorius ...并在大多数情况下访问* large *已知索引的元素,您应该切换到不同的数据结构,因为(!!)除了部分内容外,索引中的* O(n)* 。 (2认同)