【问题标题】:Filter array of arrays in purescript过滤纯脚本中的数组数组
【发布时间】:2017-02-27 19:00:45
【问题描述】:

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

【问题讨论】:

    标签: purescript


    【解决方案1】:

    我认为

    (包括不使用Array等)?

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

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

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

    【讨论】:

      【解决方案2】:

      你可以使用unsafePartial:

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

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

      【讨论】:

      • 谢谢 gb.,这是有道理的。
      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多