在Haskell wiki上写了一篇关于记录模式匹配的相对简短的文章之后,我不确定record的字段是否可以与某个值匹配,并同时分配给一个参数。
-- Sample record type
data Rec = Rec { uid :: Int, name :: String }
-- Function to update Rec's fields
updateRec :: Rec -> Rec
-- basic matching with record data constructor
updateRec (Rec _ []) = Rec 0 "Nobody"
-- dtto with as-pattern at 2nd param
updateRec (Rec idn ns@"Alice") = Rec (idn+1) (ns ++ "+1")
-- basic matching by fields values
updateRec Rec {name = "Bob", uid = 42} = Rec (10^6) "SuperBob"
-- Q: how to match by name field and assign it's value ?
updateRec Rec {name = "Bob", uid = idn} =
Rec {uid = (idn+1), name = ("Bob" ++ "+1")}
-- Q: as-pattern works only on the whole record, not on a field
updateRec rec@(Rec {name = "Bob", uid = idn}) =
Rec {uid = (idn+1), name = (name rec ++ "+1")}
-- Q: pattern guards do work, but they are a bit clumsy
updateRec Rec {name = uname, uid = idn}
| uname == "Bob" = Rec {uid = (idn+1), name = (uname ++ "+1")}
| otherwise = ...那么,是否有一些简洁的方法可以通过记录字段进行模式匹配,同时分配其值呢?
注意事项:我想避免特定的GHC扩展。
发布于 2012-01-30 15:14:05
字段名本身就是模式,所以您可以使用另一个模式。
updateRec Rec {name = uname@"Bob", uid = idn@42} = ...没有任何更简洁的方法来做到这一点,标准或使用GHC扩展。当然,对于这样简单的情况,您可以简单地省略绑定,直接在函数体中使用"Bob"和42。
https://stackoverflow.com/questions/9066026
复制相似问题