æ°ããGHCæ¡å¼µãNoFieldSelectorsã«ã¤ãã¦
ä»ã¾ã§ä¸æºã®å¤ãã£ãHaskellã®ã¬ã³ã¼ãã®æ±ããæ¹åããããã®ä¸æ©ã¨ãã¦ãNoFieldSelectorsã¨ããGHCæ¡å¼µã®å®è£ ãé²ãã¦ããã
åæ©
Haskellã«ã¯ã¬ã³ã¼ããå®ç¾©ããããã®æ§æãããã
data User = User { userId :: Int , userName :: Text }
ããå®ç¾©ããã¨ãåãã£ã¼ã«ããã¨ã«userId :: User -> Int
ã¨userName :: User -> Text
ã¨ããã²ãã¿ã¼ã«ç¸å½ããé¢æ°ãçæãããããããã®é¢æ°ã¯ç¹å¥ãªæå³åããæã£ã¦ããã以ä¸ã®ã¬ã³ã¼ãæä½ã®æ§æã«ãå©ç¨ã§ããã
- æ§ç¯
User { userId = 0, userName = "Zero" }
- ãã¿ã¼ã³ããã
case foo of User { userId = x, userName = name } -> ...
- æ´æ°
foo { userId = 1 }
ãããããã£ã¼ã«ãã¨åãååã®é¢æ°ããã使ãã¥ããã®åå ã¨ãªã£ã¦ããã
å¤ãã®ããã°ã©ãã³ã°è¨èªã§ã¯ãæ§é ä½ã®ãã£ã¼ã«ãã¯ããããåºæã®åå空éã«å±ããããHaskellã¯ããã§ã¯ãªãã以ä¸ã®ãããªå®ç¾©ã¯ãid
ãUser
ãªã®ãArticle
ãªã®ããããã¨ãPrelude
ã®id :: a -> a
ãªã®ãå¤å¥ã§ããªããããå®éã«ã¯ä½¿ããªãã
data User = User { id :: Int, name :: Text } data Article = Article { id :: Int, title :: Text }
ãã®ãããuserId
ãarticleId
ã®ããã«ååãæ¥é è¾ã«ããã®ãéä¾ã¨ãªã£ã¦ããã
ããã¨ã¿ã¤ãæ°ãå¢ããã°ããããJSONãªã©ã®ãã©ã¼ãããã«å¤æããéã«æ¥é è¾ãåãåãããã®ä»çµã¿ãªã©ãå¿
è¦ã«ãªãã使ãåæããããªããlensãæ¡å¼µå¯è½ã¬ã³ã¼ããªã©ã®ææ³ã§æ¹åã§ããé¢ããããã®ã®ãRecordWildCards
ãNamedFieldPuns
ãªã©ã®æ§æçãªæ¯æ´ãã網ç¾
æ§ã®ãã§ãã¯ãåããããªããªãã®ã¯çãã
DuplicateRecordFieldsæ¡å¼µãç¨ããã°ãè¤æ°ã®ãã¼ã¿åã§åããã£ã¼ã«ãåãæ¡ç¨ãããã¨ãä¸å¿è¨±ããããããããã²ãã¿ã¼é¢æ°ãã©ã®ãã¼ã¿åã«å±ãããå¤å®ããããã®ãã¸ã«ã«ãªå®è£ ããããé²ãã§ä½¿ããããã®ã§ã¯ãªãã®ãå®æ ã§ãã(ãã®ããã¯ãç¡ããææ¡ãæè¿åçããã *1 )ã
å¿ããã¡ã ããè¤æ°ã®ã³ã³ã¹ãã©ã¯ã¿ãæã¤ãã¼ã¿åã«ããã¦ãã¬ã³ã¼ãã®æ§æã¯ä½¿ããããã®å ´åã対å¿ããã³ã³ã¹ãã©ã¯ã¿ä»¥å¤ã«ã¯ã¨ã©ã¼ãåºãé¨åé¢æ°ãçæããããã大å¤ä½¿ãåæãæªããå®è³ªçã«ãªããã®ã¨ãã¦æ±ããã¦ããã
ææ¡
ãããªåé¡ã解決ããã¢ããã¼ãã¨ãã¦ãNoFieldSelectors
ã¨ããæ¡å¼µãææ¡ãããã
ãã®æ¡å¼µãæå¹ã«ããã¨ãã¬ã³ã¼ããå®ç¾©ãã¦ããã²ãã¿ã¼é¢æ°ã¨ãã¦ã¯ä½¿ããªããªãããã¬ã³ã¼ãã®æ§æã¨ãã¦ã¯ä½¿ããââã¤ã¾ããçãååã®ãã¡ãªãã(ã³ã³ããªã¯ã)ããªãããã¡ãªãã(ç°¡æ½ãªã³ã¼ã)ã ããå¾ãããã¨ããããã ãDuplicateRecordFields
ã¨ä½µç¨ããã°ãè¤æ°ã®ãã¼ã¿åã§åããã£ã¼ã«ãåãæ°å
¼ããªãå®ç¾©ã§ããã
ç®ã®ä¸ã®ãããã¶ã ã£ãã²ãã¿ã¼é¢æ°ã®åé¡ãåé¿ã§ããã°ãä»ã®è¨èªã¨éè²ãªãã¬ã³ã¼ãæä½ãå¯è½ã«ãªããã¬ã³ã¼ãèªä½ã®æ¡ç¨çãé«ã¾ããã¨ãäºæ³ãããã ãã¬ã¼ã³ãªãã¼ã¿åã§èµ·ããã¡ãªãå¤æ´ã«ä¼´ãç ´å£ããå¤ã®é çªãééãããã°ãåé¿ãããããªããHaskellã®å¼·ã¿ã®ä¸ã¤ã§ããã¸ã§ããªã¯ã¹ã使ã£ãå°åºæ©æ§ãæ´»ç¨ã§ããå ´é¢ãå¢ããã
ããã«ããããå®è£ ãããã§ãããRecordDotSyntax(ãããã¼ã¶ã«, æ¥æ¬èªã®ç´¹ä»ã¹ã©ã¤ã)ã®å®ç¨æ§ãé£èºçã«é«ããã ããã
è¦ç´ããã¨ãNoFieldSelectors
ã¯ä»¥ä¸ã®ã¡ãªãããããããã
- ãã£ã¼ã«ãåã«æ¥é è¾ãä»ããªãã¦ãããªã
instance FromJSON Foo
ã®ããã«ããã®ã¾ã¾ã¤ã³ã¹ã¿ã³ã¹ãå°åºã§ããå ´é¢ãå¢ãã- ä»ã¾ã§ã¯åãªãããããã©ã¯ãã£ã¹ã ã£ããè¤æ°ã³ã³ã¹ãã©ã¯ã¿ã®ã¬ã³ã¼ããå®ç¨çã«ãªã
- 害ãåã¼ãå¿é ãªãã¬ã³ã¼ããå°å ¥ã§ãã
å®è£
ææ¡è ã®Simon Hafneræ°ã«ããããã©ã°ã®è¿½å ã試é¨çãªå®è£ ãä½ãããç§ãå®éã«æ©è½ãã段éã¾ã§ããããå®æããããç¾å¨ã¯ã¬ãã¥ã¼æ®µéã«ããã
Implement NoFieldSelectors (!4017) · Merge Requests · Glasgow Haskell Compiler / GHC · GitLab
åã«é¢æ°ã®çæããããã°ãããã¨æããããããã¾ã§åç´ãªè©±ã§ã¯ãªãã£ãããã ãå種ã¬ã³ã¼ãæä½ãã³ã³ãã¤ã«ããã¨ãã®æ¯ãèãã¯ãã²ãã¿ã¼é¢æ°ã®åå¨ãåæã¨ãã¦ããããããçãã¦ãã¾ãã¨ãåãªãã¬ã³ã¼ãã§ãªããã¼ã¿åã¨åãã«ãªã£ã¦ãã¾ãã®ã ããã£ã¼ã«ãã«ç¸å½ããã·ã³ãã«ã¯ä»ã¾ã§éãä½ãããããé ã¨ãã¦ã³ã³ãã¤ã«ããã¨ãã¯ãããé ããã¨ããã¢ããã¼ããã¨ã£ãããã®è¾ºãã¯ãDuplicateRecordFieldsãªã©ã®æ©è½ã¨ã®å ¼ãåãã§æ³¥èããã®ã¨ãªã£ãããAdam Gundryæ°ã®å©è¨ã®ãããã§å®è£ ã¾ã§æã£ã¦ãããã¨ãã§ããã
ãã®ãã©ã³ãã¯GHC 9.2ã¾ã§ã«ã¯ãã¼ã¸ã§ããããã«ããããNoFieldSelectorsã¯ãä»ã¾ã§é¿ãããã®ãªãã£ãæ £ç¿ãè¦ãæ©è½ã§ããããããåºã¾ãã°GHC/Haskellã¨ããè¨èªã®å ¨ä½åãå¤ããã«éããªããã¾ã æãã¬ç¸ã®ç®ç®ç¨ã§ãããªãããGHCã®ã¬ã³ã¼ãã®é²åã楽ãã¿ã«ãã¦ããã ãããã
2021/02/17 è¿½è¨ Adam Gundryæ°ãGHCã®ã¬ã³ã¼ãå¨ãã®å é¨ä»æ§ããã©ãã·ã¥ã¢ãããããããå®è£ ããªãã¼ã¹ãã¦åæ稿ãã¦ããã ãããããã¦ã¤ãã«16æ¥ãmasterã«ãã¼ã¸ãããã
å°æ¥
PolyKindsãStrictDataã¨åæ§ãNoFieldSelectorsã¯ã¢ã¸ã¥ã¼ã«åä½ã§ããæ¯ãèããå¶å¾¡ã§ããªããå°æ¥çã«ã¯ããã¼ã¿ååä½ã§æåãã³ã³ããã¼ã«ãããããã®æ¨ãããã¥ã¡ã³ãã«ãåæ ãããããã®ä»çµã¿ãå¿ è¦ã§ããã¨èãã¦ããã