2015-10-20 134 views
0

在F#
"Hello"+"World"給「HelloWorld」。我的意思是+運算符可以連接字符串。類型「列表<int>」不匹配的類型「字符串」

Given this code: 
let iprint list:List<int> = 
let stringList=int2String4List list   //convert the int list to string list 
List.foldBack (fun acc elem -> acc+elem+',' ) stringList "" 

,但我面對錯誤:

The type 'List<int>' does not match the type 'string' 

在我看來,在F#解釋的stringList爲INT數據類型同時它是一個List<string>。但我不知道它是如何發生的?

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State 

這意味着,函數的第一參數的數據類型和表必須是相同的,但爲什麼它是堅持接受+int運營商,而不是一個字符串操作?

+0

int2String4List函數的簽名是什麼? – Petr

+0

let rec int2String4List(list:List ):List Salman

+0

更改你函數的簽名:'let iprint(list:List )=' – Petr

回答

1

您遺漏了函數聲明中的括號,因此類型註釋(List<int>)已應用於函數返回值。這將編譯:

let iprint (list:List<int>) = 
    let stringList=int2String4List list 
    List.foldBack (fun acc elem -> acc+elem+",") stringList "" 

順便說一句,是不是你int2String4List簡單List.map string

此外,fun acc elem -> ...的參數順序錯誤。如果您檢查List.foldBack預期的功能類型,您將看到它的'T -> 'State -> 'State - 第一個參數是列表中的一個元素,第二個參數是累加器。沒有您發佈的樣品(包括'T'Statestring)在太大的差別,但是是有區別的,如果你想縮短:

let iprint list = 
    List.foldBack (fun elem acc -> (string elem) + "," + acc ) list "" 

由於@JoelMueller在他的評論注意到,在最短,最快實現這個結果的方法是

let iprint = 
    List.map string >> String.concat "," 
+0

是的,是的。我只是實施我的。 – Salman

+1

是的,'List.map string >> String.concat「,」'既短又更好,因爲它沒有重複初始字符串連接。 –

相關問題