我开始从零开始学习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,但我真的很茫然。
关于我做错了什么的提示?
答案 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
将解决此问题。