我如何 "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 类型系统中不是特别有用:
- 正如 Mephy 指出的那样,您需要为每个列表长度创建一个单独的函数,并且在传递长度错误的列表时它会在运行时失败;
- 所有参数必须具有相同的类型。
鉴于此,使用元组比使用列表更有意义,因为它避免了这两个问题;标准库包括 uncurry
,它为 2 个参数的函数执行此操作,您可以类推定义 uncurry3
,等等:
uncurry3 :: (a -> b -> c -> d) -> ((a, b, c) -> d)
uncurry3 f (a, b, c) = f a b c
在 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 类型系统中不是特别有用:
- 正如 Mephy 指出的那样,您需要为每个列表长度创建一个单独的函数,并且在传递长度错误的列表时它会在运行时失败;
- 所有参数必须具有相同的类型。
鉴于此,使用元组比使用列表更有意义,因为它避免了这两个问题;标准库包括 uncurry
,它为 2 个参数的函数执行此操作,您可以类推定义 uncurry3
,等等:
uncurry3 :: (a -> b -> c -> d) -> ((a, b, c) -> d)
uncurry3 f (a, b, c) = f a b c