在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
等)?
答案 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%确定模式匹配不是部分的!