哈斯克爾的粉絲們,大家好!
我所有的問題都是關于 -- OVERLOADED(?) FUNCTION -- 部分,為了完整起見,我包括了其余部分。
我想知道使用模式匹配來多載我的函式順序是否有意義,就像我在下面的示例中所做的那樣。
我還想知道在order函式的第一個版本中帶有函式呼叫“checkBalance balance”的第一個函式是否總是得到 executerd(因為我沒有為它指定一個模式)或永遠不會(因為所有的 Food 模式都被覆寫了)在下面的函式中)。
在此先感謝初學者:)
-- TYPE DECLARATIONS --
data Spice = Regular | Medium | Hot
data Base = Noodles | Rice
data Meat = Duck | Chicken | Pork
data Sauce = Tomato | Meatballs | Carbonara
data Food = Indian Spice | Pasta Sauce | Chinese Base Meat
data DeliveryOption = Pickup | Delivery
data DeliveryTime = Immediate | Later
type CreditBalance = Int
data Order = O Food DeliveryOption CreditBalance
data OrderStatus = Success | Pending | Declined
-- OVERLOADED(?) FUNCTION --
order :: (Order, CreditBalance) -> OrderStatus
order (O {}, balance)
| not (checkBalance balance ) = Declined
| ...
order (O Indian {} _ _, _)
| ...
order (O Pasta {} _ _, _)
| ...
order (O Chinese {} _ _, _)
| ...
-- ANOTHER FUNCTION --
checkBalance :: CreditBalance -> Bool
checkBalance balance
| balance > 100 = True
| otherwise = False
uj5u.com熱心網友回復:
我看不出那個函式定義有什么問題。
函式子句按順序嘗試,因此checkBalance總是先嘗試第一個分支 with ,然后再嘗試下一個守衛,依此類推,如果第一組的守衛都不匹配,則將嘗試下一組 ( O Indian {} _ _)。
如果第一組的守衛窮盡,那么下面的其他分支將無法訪問,這意味著有些問題,但沒有更多細節很難說更多。
uj5u.com熱心網友回復:
-- OVERLOADED(?) FUNCTION --
order :: (Order, CreditBalance) -> OrderStatus
order (O {}, balance)
| not (checkBalance balance ) = Declined
| ...
上面的模式將涵蓋所有情況,任何低于它的情況都將永遠沒有機會檢查。
原因是它Order只有一個建構式,即O, and (O {}),匹配O建構式的所有可能引數。元組的另一個成員只是一個Int總是匹配的簡單。
由于模式從上到下匹配,并且選擇第一個匹配的模式,因此它們在代碼中的定義順序很重要。如果您將盡可能廣泛的模式放在頂部,那么下面更具體的模式將永遠沒有機會匹配。
至于多載函式,我可以想到如何(ab)使用模式匹配來模仿 OOP 中的函式多載,但是您還需要(ab)使用資料宣告和整個型別系統來彎曲它們以符合這樣的想法只會讓事情變得更糟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339376.html
下一篇:帶字符的Haskell型別推斷
