2017-02-27 86 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在這裏是一個很好的選擇。 –