因為它newtype在型別系統中被視為一個完全不同的型別,我想知道是否有任何方法可以使用模式匹配或使用 newtype 迭代串列,如下所示。
newtype Foo = Foo [Int]
bar :: Foo -> Int
bar (x : xs) = x bar xs
bar [] = 0
uj5u.com熱心網友回復:
有多種選擇。
只需在適當的位置手動包裝/解開新型別。
bar (Foo (x : xs)) = x bar (Foo xs) bar (Foo []) = 0在串列上實作函式,并在傳遞給函式之前解包一次。在這種情況下,串列版本是 just
sum,所以我們可以使用bar (Foo xs) = sum xs制作一個允許
Foo像串列一樣操作值的界面。{-# LANGUAGE PatternSynonyms #-} {-# COMPLETE (:%), FooNil #-} pattern (:%) :: Int -> Foo -> Foo pattern x :% xs <- Foo (x : (Foo -> xs)) where x :% xs = Foo (x : getFoo xs) pattern FooNil :: Foo pattern FooNil = Foo [] bar :: Foo -> Int bar (x :% xs) = x bar xs bar FooNil = 0抽象的。您實際上并不需要特定的串列解構器,您只需要某種方法來實作包含資料的折疊。為此有一個標準
Foldable類base,但它要求您的容器對包含的型別進行引數化。由于它不是引數化的,因此您需要使用包中MonoFoldable的類mono-traversable。import Data.MonoTraversable type instance Element Foo = Int import MonoFoldable Foo where ofoldr f (Foo (x:xs)) e = f x $ ofoldr f (Foo xs) e ofoldr _ (Foo []) e = e bar = ofoldr ( ) 0
請注意,一般來說,這種功能應該用嚴格的左折疊而不是右折疊來實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517129.html
標籤:哈斯克尔新型
