首页 > 解决方案 > 列出映射相应元素对的半群实例

问题描述

我正在寻找最常见的 Haskell 库,它引入了通过将 ing委托给其元素[a]来实例化的包装器,其方式类似于:Semigroupmappend

newtype SList a = SList { slist :: [a] } 

instance Semigroup a => Semigroup (SList a) where
    l1 <> l2 = SList $ foldl1 (<>) <$> transpose [slist l1, slist l2]

例如,SList [a,b,c] <> SList [d,e,f,g]将评估为SList [a <> d, b <> e, c <> f, g]

令我惊讶的是,我在 Prelude 或其他最受欢迎的库中都找不到任何东西。这是为什么?

标签: listhaskellsemigroup

解决方案


不是包装器类型,而是在常规列表上执行此操作的不同函数:salign来自 semialign 的 Data.Semialign。您可以直接调用它,也可以根据它实现 SList:

import Data.Semialign (salign)
instance Semigroup a => Semigroup (SList a) where
    SList l1 <> SList l2 = SList (salign l1 l2)

推荐阅读