我有一个函数a -> [b]
,我正在寻找一个函数将其转换为类似的函数,但列表的元素被包装在一些新类型/数据中:a -> [t b]
.所以我需要找到一个函数,它执行以下操作:(a -> [b]) -> (a -> [t b])
.
Hoogle将traverse
作为最接近的匹配,但这并不完全是我想要的。有没有办法使用 Haskell 强大的类型类构造我需要的函数?
没有它我可以管理,但代码将不得不像Boardable <$> makeBListFrom a
一样更冗长,其中Boardable
构造函数代表t
.
如果您使用的是newtype
,则正在寻找coerce
(因为从运行时的角度来看,将a -> [b]
转换为a -> [t b]
是无操作的)。当然,这只有在Haskell能够推断出你试图强制的类型时才有效。
你会得到coerce makeBListFrom :: A -> [Boardable B]
(其中A
和B
是根据makeBListFrom :: A -> [B]
确定的一些类型)。
这对data
不起作用.另外,如果是我,我会坚持fmap Boardable . makeBListFrom
- 编译器和读者都更清楚您的意图(其中任何一个都可以合成类型,而不必检查一个类型)。
为什么不在每个元素上map
构造函数呢?
Prelude> data X a = C a deriving Show
Prelude> map C [1, 2, 3]
[C 1,C 2,C 3]
Prelude> :t map C [1, 2, 3]
map C [1, 2, 3] :: Num a => [X a]