2014-01-14 43 views
0

我開始從頭開始學習f#,並且發現自己對數組和列表之間的差異感到十分困惑,我知道列表是不可改變的,但仍然存在。F#在列表中添加一個元素(如果它不存在)

我試圖創建一個函數,如果它不存在並返回新列表中的元素添加到一個列表,否則,如果它存在返回當前列表。

這裏是我到目前爲止有:

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

電子:: L不工作時,Visual Studio拋出

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

我已經覺得有點腥,我要使用Array.exists,但我真的很茫然。

有什麼暗示我做錯了什麼?

回答

2

使用Array.exists給你elem函數簽名x:'a -> ('a [] -> bool),從而影響elemOrAdd定義假設l類型推斷的數組,但作爲一個列表。將elem定義更改爲let elem x= List.exists ((=) x)將解決該問題。

+0

是的,就是這樣。但是,數組和列表之間的區別讓我感到困惑。 –

+0

簡潔['array'](http://msdn.microsoft.com/en-us/library/dd233214.aspx)是一個** mutable **固定大小的集合,其中包含運算符'.'和'[]' 直接訪問任何元素,而['list'](http://msdn.microsoft.com/en-us/library/dd233224.aspx)是**不可變的**集合與運算符'::'和'@ ' 只允許順序訪問元素。 –

1

在F#中,array類型是System.Array類型,您可能會記得C#等語言。 list類型是不可變的single-linked list,它是FSharp.Core的一部分。

當您在elem函數,編譯器推斷該功能預計array類型使用Array.exists,編譯器然後推斷您elemOrAdd功能還預計array類型。這就解釋了爲什麼,當你用::將一個元素附加到list時,編譯器抱怨道。 ::運營商僅適用於list類型。

更改爲使用List.exists您的elem函數將解決此問題。

相關問題