2016-04-21 54 views
0

我要打印不在哈希表的數字,在這種情況下,1,3和5我'得到以下錯誤:期待型單元OCaml中

This expression has type int but an expression was expected of type 單元

爲什麼它期望類型單位?

let l = [1; 2; 3; 4; 5];; 
let ht = Hashtbl.create 2;; 
Hashtbl.add ht 0 2;; 
Hashtbl.add ht 1 4; 
let n = List.iter (fun a -> if Hashtbl.mem ht a then -1 else a) l in 
if n > 0 then print_int a;; 

回答

0

對於線條List.iter (fun a -> if Hashtbl.mem ht a then -1 else a) l,您可以爲列表中的每個元素調用一個函數。

此函數必須具有類型單位,因爲將n個函數應用程序的結果分配給任何內容都沒有意義。

你可能想要的是

let l = [1; 2; 3; 4; 5];; 
let ht = Hashtbl.create 2;; 
Hashtbl.add ht 0 2;; 
Hashtbl.add ht 1 4; 
List.iter (fun a -> if not (Hashtbl.mem ht a) then (print_int a; print_newline())) l 

在這個解決方案,您可以調用打印功能,爲每個變量。表述「print_int(-1)」又是單元類型(如上所述)。

+1

「* ...打印不在散列表中的數字... *」 - 這意味着傳遞給List.iter的lambda看起來應該如下所示:fun a - > if if(Hashtbl.mem ht a)then(print_int a; print_newline())' –

+0

@AntonTrunov感謝提示,重讀那部分:) 我用你的行更新了我的verison。現在它是正確的! –

+0

另一種說法是'List.iter'是一個必要的構造;迭代的函數只能起副作用。相反,'List.map'是一個功能性構造。 – user3240588