2012-03-23 41 views
1

我遇到的SML 2度混亂的問題,希望有人能幫助我:比函數小的SML

首先是一個函數,它接受一個元素和列表,並決定中是否存在該元素名單與否,這裏是我嘗試寫代碼:

fun member (e,L) = foldl (fn(a,b) => if (e = b) then true else false) false L; 

,但我得到BOOL *「列表 - > BOOL但我需要的是‘’A *‘’名單 - > bool

至於第二個,它還需要一個元素和一個列表,但返回的元素列表小於通過一個。我不確定這是否應該通過地圖或foldr/foldl來完成。 有什麼建議嗎?

感謝提前:)

+1

注意'if(e = b)then true else false'只是說'e = b'本身的複雜方式。 – 2012-03-23 14:34:20

回答

3

關於第一個問題,在fn (a, b) => ...a是下一個元素和b是累加器。由於您將eb進行了比較,因此電子郵件的類型爲bool。你應該a比較e,並且永不覆蓋b當它成爲true

fun exists (e, L) = 
    foldl (fn (a, b) => e = a orelse b) false L 

對於第二個問題,你可以使用foldr/foldl這樣做。它與第一個例子相似;您以空列表作爲累加器開始,並在該元素小於閾值時爲其預先添加一個元素。

作爲一個權衡,foldr給你正確的順序,但它不是尾遞歸。另一方面,foldl是尾遞歸的,但以相反的順序給出結果列表。

+0

非常感謝:)我設法解決了第二個問題,使用foldl以及 – AuthenticReplica 2012-03-23 12:01:11

+1

而且'如果e = a,那麼true else b'可以縮寫爲'e = a orelse b'。 ;) – 2012-03-23 14:35:22

+0

@AndreasRossberg:謝謝,我在你的建議後更新了答案。 – pad 2012-03-23 14:47:08

0

查看一個元素是否在列表中或嘗試這個: fun elementExist(e,nil)= false | elementExist(e,x :: xs)= if e = x orelse elementExist(e,xs)then true else false;

爲第二個到從列表中刪除現有的元件:

樂趣elFromList(E,無)= [] | elFromList(e,x :: xs)= if e = x then elFromList(e,xs)else x :: elFromList(e,xs);

祝您好運!