F#的自定义链接列表和引用(f# custom linked list and references

2019-10-20 12:20发布

我是新来的这门语言。 为了尝试理解引用我已经尝试实现一个简单的引导列表大一大学计算机科学的方法。

type item = { 
    value:float 
    next:ref<item>
}

type list() = 
    let head:ref<item> = null // tried instantiation so many different ways and it likes none of em

    let sum i = 
        if i == null then
            0
        else 
            i.value + sum i.next // constructor not defined?

请告诉我为什么IM坏在这

Answer 1:

首先你尝试实现它以某种方式势在必行 - 这是好的,但没有真正发挥作用。 总之,第一件事情你有是问题,你不能指定null -如果你真的想你必须添加[<AllowNullLiteral>]到您的item类型(当然你要使它成为一个类,而不是一个记录):

[<AllowNullLiteral>]
type Item(value, next) = 
    member this.value = value
    member this.next : Item ref = next

let head : ref<Item> = ref null

let rec sum (i : Item) = 
    if i = null then
        0.0
    else 
        i.value + sum !i.next

但是,这是几乎从来没有一个好主意,所以我会这样开始:

module List =

   type Item = { value : float; next : List }
   and  List = Item option ref

   let empty : List = ref None
   let single x = { value = x; next = ref None }

   // this is how you can change the list
   let rec append x l =
      let item = singleton x
      match !l with
      | None -> 
         l := Some item
      | Some node ->
         append x node.next

   let rec sum (l : List) =
      match !l with
      | None      -> 0.0
      | Some item -> item.value + sum item.next

现在,如果你仔细观察,你会看到,你真的不需要裁判,如果你只是附加在前面,瞧...你有你的常用功能列表;)

PS:你忘了一些其他的东西太多:

  • 您使用的漂浮在那里,所以你必须使用0.0而不是0
  • 您的sum -功能必须是递归的(请注意这不是尾递归,所以你会得到大名单的问题!)
  • 你必须取消引用 ref与β-细胞!
  • 你必须构建ref POS细胞与ref (例如ref null
  • 您的type list() =作出没有意义的我,所以我将它转换成一个模块

PPS:请不说这不是F#-WAY变异,这样的事情-它只是告诉你,你如何能做到这... ...但不要,如果你没有



文章来源: f# custom linked list and references