【问题标题】:Map and pattern matching地图和模式匹配
【发布时间】:2015-06-03 08:26:42
【问题描述】:

我在这里有一个我正在努力解决的任务:

type multimap<'a,'b when 'a:comparison and 'b:comparison> = MMap of Map<'a, list<'b>>

作业指出

我们将多图的规范表示定义为 值列表是有序的。 声明一个函数canonical: multimap&lt;'a,'b&gt; -&gt; multimap&lt;'a,'b&gt; when 'a : comparison and 'b : comparison 其中canonical m 返回m 的规范表示。

现在我有:

let toOrderedList (mm:multimap<'a,'b>)  = 
    match mm with
    | MMap m -> 

我不知道如何对此进行模式匹配。有什么帮助吗? :3

【问题讨论】:

  • 提示: Map.map,当然还有List.sort ...现在做显而易见的事情
  • 除此之外,如果您使用参数进行解构,您可以稍微缩短您的功能:let toOrderedList (MMap m) = ...
  • ... 顺便说一句:提示对 pattern-match 没有帮助-因为您已经这样做了(您的 mMap&lt;'a, 'b list&gt;)-剩下的就是将键后面的所有列表带入 order (...对它们进行排序) - 现在你当然不能改变那些 Maps&lt;...&gt; - 所以你必须 map 完整的结构。 ..现在看看提示...
  • 我在看作业时非常怀疑,因为我自己不知道如何正确解决这个问题。
  • type-alias 只是一个别名 - 使用它您可以将 MMap 设为私有并发布一个智能构造函数(例如,就像 let create = MMap &gt;&gt; cannonical 一样,您只能构造 cannonical multimaps 的表示

标签: f#


【解决方案1】:

好的,只是为了给这个答案,您正在寻找的功能可以这样写:

let cannonical (MMap m) = 
    m 
    |> Map.map (fun _ vs -> List.sort vs) 
    |> MMap

这会解构参数定义中的multimap(模式匹配),然后通过管道传递Map&lt;&gt;m - 使用Map.maplists 进行排序,最后将其包装回mulitmap使用构造函数MMap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2021-06-13
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2016-01-19
    相关资源
    最近更新 更多