由于newtype在类型系统中被视为一个完全不同的类型,我想知道是否有任何方法可以使用模式匹配或使用newtype迭代列表,如下所示。
newtype Foo = Foo [Int]
bar :: Foo -> Int
bar (x : xs) = x + bar xs
bar [] = 0发布于 2022-10-12 13:34:34
有多种选择。
bar (Foo (x : xs)) =x+ bar (Foo xs) bar (Foo []) = 0
sum,所以我们可以使用bar (Foo )= sum xs
Foo值。{-# LANGUAGE PatternSynonyms #-} {-#完成( :% ),FooNil #-}模式( :% ) ::Int -> Foo -> Foo模式x :% xs <- Foo (x:(Foo -> xs))其中x:% xs = Foo (x : getFoo xs)模式FooNil : Foo模式FooNil = Foo [] bar ::Foo -> Int (x:% xs) =x+ bar xs bar = 0
Foldable中有一个标准的base类,但是它需要容器对包含的类型进行参数化。因为它不是参数化的,所以您需要使用来自mono-traversable包的mono-traversable类。导入Data.MonoTraversable类型实例元素Foo = Int MonoFoldable Foo,其中ofoldr f (Foo (x: xs) ) e=f x$ ofoldr f (Foo Xs)e ofoldr _ (Foo []) e=e bar = ofoldr (+) 0
注意,一般来说,这种函数应该用严格的左折叠而不是右折叠来实现。
https://stackoverflow.com/questions/74041945
复制相似问题