我如何 "unpack" 列表作为 Haskell 中的单个参数?

How do I "unpack" a list as individual arguments in Haskell?

在 Haskell 中是否有内置或惯用的方式 "unpack" 列表的元素并将它们视为函数的单独参数?

例如,如果我有 f :: a -> b -> c -> d -> e 是否有像

这样紧凑的东西
f (unlist x)

完成

let x = [1,2,3,4] in f (x!!0) (x!!1) (x!!2) (x!!3) 

或至少 "shouty"(太多 !! 重复)解压缩一般已知长度列表的方法(以便它可以用作函数的参数,在此例)。


基本上我正在寻找的东西类似于 Sequence@@ 在 Mathematica 中所做的事情:

f[Sequence@@{1, 2, 3, 4}]

它在 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