将函数的输出包装为新的数据类型



我有一个函数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](其中AB是根据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]

最新更新