2016-10-03 31 views
1

我使用NEWTYPE作爲記錄的字段,和模式匹配的「父」類型來提取嵌套值是麻煩:如何整潔地解構嵌入到記錄中的newtypes?

newtype CityName = CityName String 
newtype City = City { 
    name :: CityName 
} 
instance showCity :: Show City where 
    show (City { name }) = case name of (CityName cn) -> "City(" <> cn <> ")" 

我可以解構「父」的類型,但然後我使用另一個模式匹配來提取包裝的字符串 - 即使新類型只有一個數據構造函數。只用一種模式解構整個類型會更方便。

這可能嗎?如果是這樣,我不能得到正確的語法。我嘗試了類似show (City { name :: (CityName cn) }) = cn的東西,但它給了我語法錯誤。 PureScript by Example也沒有幫助我,但也許有更好的方法來做我想要的?

回答

1

你試過什麼是差不多吧,但你只需要一個冒號,當模式匹配記錄:

instance showCity :: Show City where 
    show (City { name: CityName cn }) = "City(" <> cn <> ")" 

雙冒號僅用於註釋類型,價值層面的東西總是使用單冒號。

+0

謝謝,很好的解釋。這個語法是否記錄在某處,或者它與Haskell中的相同?我不知道是否還有更多我不知道的解構「詭計」。 – stholzm

+1

這裏有關於Github Wiki的語言指南:https://github.com/purescript/purescript/wiki/Language-Guide#record-patterns。它也可能在PureScript書中有所涉及,但這不是真正的參考,所以也許不是尋找這種事情的最簡單的地方! –