PureScript - 未知长度的模式匹配数组
PureScript - Pattern match arrays of unknown length
有没有办法在 PureScript 中模式匹配未知长度的数组?例如,这是我如何使用 Haskell 中的 List
:
addFirstTwo :: (Num a) => [a] -> a
addFirstTwo (x:y:_) = x + y
我在 PureScript 中尝试了类似的操作(使用 Array a
而不是 [a]
),但出现以下错误:
Operator Data.Array.(:) cannot be used in a pattern as it is an alias for function Data.Array.cons.
Only aliases for data constructors may be used in patterns.
我知道我可以在 PureScript 中使用 List
s 而不是数组,但我想与数组进行模式匹配。阅读 Array pattern matching section of PureScript by Example.
后,我没有看到如何执行此操作
数组缺点模式很久以前就从语言中删除了。您可以改用 Data.Array
中的 uncons
,如下所示:
case uncons xs of
Just {head: x, tail} ->
case uncons tail of
Just {head: y, tail: _} -> x + y
Nothing -> 0
Nothing -> 0
但要注意 uncons
∈ Θ(n).
或者您可以使用 take
来自 Data.Array
:
case take 2 xs of
[a, b] -> a + b
_ -> 0
take
∈ Θ(min(n, m))(在本例中 m = 2)。
甚至 (!!)
来自 Data.Array
:
case xs !! 0, xs !! 1 of
Just x, Just y -> x + y
_, _ -> 0
一般来说,列表比数组更易于使用。
有没有办法在 PureScript 中模式匹配未知长度的数组?例如,这是我如何使用 Haskell 中的 List
:
addFirstTwo :: (Num a) => [a] -> a
addFirstTwo (x:y:_) = x + y
我在 PureScript 中尝试了类似的操作(使用 Array a
而不是 [a]
),但出现以下错误:
Operator Data.Array.(:) cannot be used in a pattern as it is an alias for function Data.Array.cons. Only aliases for data constructors may be used in patterns.
我知道我可以在 PureScript 中使用 List
s 而不是数组,但我想与数组进行模式匹配。阅读 Array pattern matching section of PureScript by Example.
数组缺点模式很久以前就从语言中删除了。您可以改用 Data.Array
中的 uncons
,如下所示:
case uncons xs of
Just {head: x, tail} ->
case uncons tail of
Just {head: y, tail: _} -> x + y
Nothing -> 0
Nothing -> 0
但要注意 uncons
∈ Θ(n).
或者您可以使用 take
来自 Data.Array
:
case take 2 xs of
[a, b] -> a + b
_ -> 0
take
∈ Θ(min(n, m))(在本例中 m = 2)。
甚至 (!!)
来自 Data.Array
:
case xs !! 0, xs !! 1 of
Just x, Just y -> x + y
_, _ -> 0
一般来说,列表比数组更易于使用。