首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记录的字段是否可以与某个值匹配,并同时分配给一个参数?

记录的字段是否可以与某个值匹配,并同时分配给一个参数?
EN

Stack Overflow用户
提问于 2012-01-30 15:10:17
回答 1查看 7.9K关注 0票数 28

在Haskell wiki上写了一篇关于记录模式匹配的相对简短的文章之后,我不确定record的字段是否可以与某个值匹配,并同时分配给一个参数。

代码语言:javascript
复制
-- 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扩展。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-30 15:14:05

字段名本身就是模式,所以您可以使用另一个模式。

代码语言:javascript
复制
updateRec Rec {name = uname@"Bob", uid = idn@42} = ...

没有任何更简洁的方法来做到这一点,标准或使用GHC扩展。当然,对于这样简单的情况,您可以简单地省略绑定,直接在函数体中使用"Bob"42

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9066026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档