2017-02-27 106 views
0

这样做在psci阵列的滤光器阵列中purescript

> 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等)?

回答

3

您可以使用unsafePartial

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

我不会建议REPL之外这样做虽然,除非您已预先消毒的输入,你是100%肯定的模式匹配是不偏!

+0

谢谢你,这是有道理的。 –

4

我认为

(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]] 

融入一个线,但不读得非常好......

+0

谢谢stholzm,我认为Tuple在这里是一个很好的选择。 –