F#使用自定义列表附加自定义表

时间:2014-05-26 14:18:44

标签: f# functional-programming

我正在尝试使用 Decl

列表创建一个扩展 symbolTable 的函数

说明:

type Typ =  |Integer
            |Boolean
            |Ft of Typ list * Typ;;

type Decl = string * Typ;;

type symbolTable = Map<string, Typ>;;

我正在尝试以下方式:

let extendST (st: symbolTable) (lst: Decl list) : symbolTable =
    let mutable returnValue = st
    for (x,y) in lst do
        returnValue = returnValue.Add(x,y)
    returnValue;;

但显然没有任何东西被添加到returnValue中(该函数返回与输入相同的symbolTable)。

我显然是F#的新人,但这让我头疼,所以我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:3)

在F#中,赋值(更改mutable变量的值)是使用<-编写的,而不是使用=(这意味着只是进行相等测试)。您的代码正在比较这两个值,然后忽略结果(这是有效的,但不是您想要的)。更正后的版本如下所示:

let extendST (st: symbolTable) (lst: Decl list) : symbolTable =
    let mutable returnValue = st
    for (x,y) in lst do
        returnValue <- returnValue.Add(x,y)
    returnValue

但是,如果您正在寻找功能性解决方案,可以使用fold

来编写
let extendST (st: symbolTable) (lst: Decl list) : symbolTable =
    lst |> List.fold (fun map (k, v) -> Map.add k v map) st

fold函数采用某种状态(您的符号表)并为给定列表lst的每个元素计算新状态。这里,新状态是使用键值对k,v扩展的新映射。