在纯脚本中过滤数组数组

Filter array of arrays in purescript

psci 中执行此操作:

> filter (\[a,b] -> a > 1) [[1,2],[3,4]]

导致编译错误:

A case expression could not be determined to cover all inputs.

由于[a,b]可能无法匹配,这是有道理的。

我知道我能做到:

> :p
… let f [a, b] = a > 1
…     f _ = false
…
> filter f [[1,2],[3,4]]
[[3,4]]

但这对于在 psci repl 中做简单的过滤器来说是相当长的。有没有涉及更少打字的解决方案(包括不使用 Array 等)?

我认为

(including not using Array, etc.)?

意味着您可以使用元组或记录,而不是嵌套数组。它们的结构更容易进行模式匹配/解构,例如:

filter (\(Tuple a b) -> a > 1) [ Tuple 1 2, Tuple 3 4 ]

据我所知,PureScript 不支持单行 case 表达式的语法(如 case arr of { [a,b] -> a > 1; _ -> false })。 如果您需要使用数组,我认为您的多行解决方案比类似的解决方案更好:

filter (\arr -> fromMaybe false (map (\a -> a > 1) (head arr))) [[1,2],[3,4]]

适合一行,但读起来不太好...

您可以使用 unsafePartial:

> import Prelude
> import Data.Array
> import Partial.Unsafe
> filter (unsafePartial \[a,b] -> a > 1) [[1,2],[3,4]]
[[3,4]]

不过,我不建议在 REPL 之外这样做,除非您已经预先清理了输入并且您 100% 确定模式匹配不是部分匹配!