【问题标题】:F# Add New Item to Collections.Map?F# 向 Collections.Map 添加新项目?
【发布时间】:2016-03-28 23:53:28
【问题描述】:

我想创建一个地图和一个将项目添加到该地图的函数。

这就是我所做的

let mymap = Map.empty

let myfunc nId nValue = 
    mymap = Map.add nId nValue ;;

但这产生了以下错误
This expression was expected to have type Map<'a,'b> but here has type Map<'c,'d> -> Map<'c,'d>

我做错了什么?

【问题讨论】:

    标签: f# functional-programming


    【解决方案1】:

    地图是不可变的,所以你需要let mutable mymap

    另外,= 进行比较,你需要 <- 进行分配,这就是你得到错误的原因。

    类似

    let mutable mymap = Map.empty
    
    let myfunc nId nValue = 
        mymap <- Map.add nId nValue mymap;;
    

    是你想要的

    【讨论】:

      【解决方案2】:

      除了将 mymap 分配给 John 的回答中的新值之外,您还可以使用更惯用的 FP 方式来完成:

      let mymap = Map.empty
      
      let myfunc nId nValue = 
          Map.add nId nValue mymap
      

      John 的myfunc 因为赋值而有'a -&gt; 'b -&gt; unit 的签名,我的有'a -&gt; 'b -&gt; Map&lt;'a, 'b&gt; 的签名,这在FP 中更常见的是返回一个新的Map,而不是修改现有的地图(@ 987654327@).

      【讨论】:

      • 这是否意味着每次更改项目时我都必须创建新变量来存储新表?
      • @MichaelO.Y.,是的。但这在 F# 或一般的函数式编程中被认为更惯用,这是为了避免副作用。
      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2018-07-27
      • 2012-02-16
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多