在purescript中过滤数组数组

时间:2017-02-27 19:00:46

标签: 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等)?

2 个答案:

答案 0 :(得分:4)

我认为

  

(包括不使用Array等)?

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

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

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

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

适合一行,但读得不太好......

答案 1 :(得分:3)

您可以使用unsafePartial

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

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