首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中迭代“`newtype`”列表

如何在Haskell中迭代“`newtype`”列表
EN

Stack Overflow用户
提问于 2022-10-12 12:37:33
回答 1查看 92关注 0票数 2

由于newtype在类型系统中被视为一个完全不同的类型,我想知道是否有任何方法可以使用模式匹配或使用newtype迭代列表,如下所示。

代码语言:javascript
复制
newtype Foo = Foo [Int]

bar :: Foo -> Int
bar (x : xs) = x + bar xs
bar [] = 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-12 13:34:34

有多种选择。

  1. 只是手动地包装/打开新类型的正确位置。

bar (Foo (x : xs)) =x+ bar (Foo xs) bar (Foo []) = 0

  1. 在列表上实现该函数,并在传递给该函数之前将其展开一次。在本例中,列表版本只是sum,所以我们可以使用

bar (Foo )= sum xs

  1. 创建了一个接口,允许像列表一样操作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

  1. 文摘。您并不真正需要特定的列表解构函数,您只需要某种方式来实现对包含的数据的折叠。为此,在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

注意,一般来说,这种函数应该用严格的左折叠而不是右折叠来实现。

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

https://stackoverflow.com/questions/74041945

复制
相关文章

相似问题

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