鑑於以下組代表一個存儲類型:F#對於列表中的每個元素,應用功能,在列表元素中,b
type Article = string
type Amount = int
type Price = int
type Desc = Amount*Price
type Stock = (Article*Desc) list
type Order = Article * Amount
type Status<'a> = Result of 'a | Error of string
我想打一個函數,它接受一個Order
和Stock
和回報一個Status<Price * Stock>
。下面get (a,k) st
所定義的函數的值是Result (p,st')
其中p
是k
件a
和st'
價格是通過除去k
件a
從st
獲得的新的庫存。
例子:
let rec get (a,k) st =
match st with
| (a',(n',p'))::rest when a'=a -> Result (p'*k,(a',(n'-k,p'))::rest)
| (a',(n',p'))::rest ->
match get (a,k) rest with
| Result (price,stock) -> Result (price,(a',(n',p'))::stock)
| Error e -> Error e
get ("a2", 10) st
val it : int * (string * (int * int)) list =
Result (200, [("a1", (100, 10)); ("a2", (40, 20)); ("a3", (25, 40))])
現在,我怎麼會去這樣做,如果我花了一個Order list
?
如get [("a2",10);("a1",10)] st
將返回Result (300, [("a1", (90, 10)); ("a2", (40, 20)); ("a3", (25, 40))])
你'get''代碼失敗'無與倫比 '['' – TheQuickBrownFox
固定編譯 - 笨手笨腳。 – Khaine775
我不明白您的預期產出中的數字是如何計算的。減法應該發生在'a2'上嗎?爲什麼'300'? –