如果元素不存在,则将其添加到列表中

时间:2014-01-14 12:53:08

标签: f# functional-programming

我开始从零开始学习f#,我发现自己对数组和列表之间的区别很困惑,我知道列表是不可变的但仍然存在。

我正在尝试创建一个向列表添加元素的函数(如果它不存在)并返回新列表,否则返回当前列表。

这是我到目前为止所拥有的:

let elem x= Array.exists ((=) x)
let elemOrAdd e l = if elem e l then l else e::l

e :: l不起作用,视觉工作室抛出

This expression was expected to have type
    'a []    
but here has type
    'b list

我已经发现有点可疑,我必须使用Array.exists,但我真的很茫然。

关于我做错了什么的提示?

2 个答案:

答案 0 :(得分:2)

使用Array.exists为您的elem函数提供签名x:'a -> ('a [] -> bool),这会影响elemOrAdd定义,假设l类型推断出一个数组,但用作列表。将elem定义更改为let elem x= List.exists ((=) x)将解决问题。

答案 1 :(得分:1)

在F#中,array类型是System.Array类型,您可能会记住C#等语言。 list类型是一个不可变的single-linked list,它是FSharp.Core的一部分。

当您在Array.exists函数中使用elem时,编译器推断该函数需要array类型,然后编译器推断出您的elemOrAdd函数也期望{{1}类型。这就解释了为什么当你使用array将元素附加到::时,编译器会抱怨。 list运算符仅适用于::类型。

list功能中更改为使用List.exists将解决此问题。