如何定義自由幺半群的超類約束?

考慮以下自由幺半群的類型類。

class FreeMonoid f where
    inj :: a -> f a
    univ :: Monoid m => (a -> m) -> f a -> m

inj將一個值注入到自由幺半群中,而univ是自由幺半體的普遍性質。

此類的實例應滿足以下規則。

  • Identity: univ f . inj = f
  • 空閑空:univ f mempty = mempty
  • 免費附加:univ f (m <> n) = univ f m <> univ f n

注意,如果fFreeMonoid的一個實例,那么(f a)必須是univ f (m <> n) = univ f m <> univ f n的實例。否則,最后兩條定律就沒有意義了。那么,如何指定此約束?這是我嘗試過的。

class Monoid (f a) => FreeMonoid f where
    inj :: a -> f a
    univ :: Monoid m => (a -> m) -> f a -> m

沒有這個約束使得使用這個類很不方便。例如,考慮以下函數。

mapFreeMonoid :: (FreeMonoid f, Monoid (f b)) => (a -> b) -> f a -> f b
mapFreeMonoid f = univ (inj . f)

由于fFreeMonoid的一個實例,因此我們不必指定Monoid (f b)約束。理想情況下,我們應該能夠如下定義上述函數。

mapFreeMonoid :: FreeMonoid f => (a -> b) -> f a -> f b
mapFreeMonoid f = univ (inj . f)
? 最佳回答:

您可以嘗試嘗試使用QuantifiedConstraints擴展名。

class (forall a. Monoid (f a)) => FreeMonoid f where
   ...

然后在沒有附加約束的情況下編譯代碼。

mapFreeMonoid :: FreeMonoid f => (a -> b) -> f a -> f b
mapFreeMonoid f = univ (inj . f)
主站蜘蛛池模板: 精品国产一区二区三区AV性色| 无码日韩精品一区二区免费暖暖| 在线精品动漫一区二区无广告| 亚洲福利视频一区| 国产激情一区二区三区四区| 亚洲视频一区在线观看| 视频一区视频二区日韩专区| 国产精品一区二区无线| 亚洲av色香蕉一区二区三区| 亚洲国产美国国产综合一区二区| 成人免费av一区二区三区| 国产一区二区三区在线免费| 国产成人av一区二区三区在线| 亚洲AV无码一区二区三区人| 91福利一区二区| 亚洲愉拍一区二区三区| 国产乱码一区二区三区| 亚洲高清一区二区三区| 亚洲一区中文字幕| 精品无码国产一区二区三区51安 | 免费无码一区二区三区蜜桃大| 文中字幕一区二区三区视频播放| 亚洲一区二区视频在线观看| 波霸影院一区二区| 久久综合一区二区无码| 精品一区二区无码AV| 久久久久国产一区二区三区| 国精产品一区一区三区免费视频 | 性无码免费一区二区三区在线 | 精品一区二区三区在线观看l| 人妻少妇一区二区三区| 国产丝袜美女一区二区三区| 麻豆天美国产一区在线播放| 亚洲国产视频一区| 韩国福利视频一区二区 | 日韩精品无码中文字幕一区二区 | 国产精品乱码一区二区三区| 中文字幕在线无码一区二区三区| 美女一区二区三区| 国产一区二区好的精华液| 日本精品一区二区三区在线视频|