- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上周我一直在努力掌握 Haskell 的一些“核心”类型和类型类(但总共学习 Haskell 的时间最多两周),我发现了一些让我烦恼的事情:
o = (.)
(<>) = mappend
仅这两个事实,以及 Semigroupoids 和 Semigroups 都只有组合元素的概念(semigroupoid-composition 与 semigroup-multiplication)并且 Category 和 Monoid 也有“统一”的概念(身份与单元元素) ) 想到可以表达半群和半群之间的关系,以及类别和幺半群之间的关系,如下所示
import Prelude hiding (id, (.))
import Data.Semigroupoid
import Data.Semigroup
import Control.Category
import Data.Monoid
instance Semigroupoid c => Semigroup (c a a) where
(<>) = o
instance Category c => Monoid (c a a) where
mempty = id
mappend = (.)
main = putStrLn "Does not type-check!"
现在,我不确定为什么不能编译; ghc 编译器说:
All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
但碰巧包括
{-# LANGUAGE FlexibleInstances #-}
在文件之上修复一切。
上面表达的关系似乎没有内置在库中,而Semigroupoid和Category之间以及Semigroup和Monoid之间的关系是内置的。
这有什么具体原因吗,我只是想念它?
也许与神秘的“FlexibleInstances”有关?
如有任何见解,我们将不胜感激。
最佳答案
如果它只需要 FlexibleInstances
没有人会介意(该扩展是完全无害的),但不幸的是,一旦您添加足够有趣的其他实例,它也会导致需要一个非常无害的其他扩展。即,
{-# LANGUAGE FlexibleInstances #-}
import Control.Category (Category)
instance Category c => Monoid (c a a)
data Nontrivial s q = Nontrivial {
someLabel :: String
, someValues :: [(s, Int)]
, otherValues :: Maybe (String, q)
, moreStuff :: ({-...-})
}
instance (Monoid s, Monoid q) => Monoid (Nontrivial s q) where
mempty = Nontrivial "" [] Nothing ()
main = case mempty :: Nontrivial String String of
Nontrivial _ _ _ _ -> return ()
不编译:
$ runhaskell wtmpf-file6064.hs
wtmpf-file6064.hs:17:13:
Overlapping instances for Monoid (Nontrivial String String)
arising from a use of ‘mempty’
Matching instances:
instance Category c => Monoid (c a a)
-- Defined at wtmpf-file6064.hs:5:10
instance (Monoid s, Monoid q) => Monoid (Nontrivial s q)
-- Defined at wtmpf-file6064.hs:14:10
In the expression: mempty :: Nontrivial String String
In the expression:
case mempty :: Nontrivial String String of {
Nontrivial _ _ _ _ -> return () }
In an equation for ‘main’:
main
= case mempty :: Nontrivial String String of {
Nontrivial _ _ _ _ -> return () }
现在,您可以通过添加 {-# OVERLAPPABLE #-}
Pragmas 使其正常工作,但这是一些相当繁琐的事情,可能会导致奇怪的行为。强烈避免此类情况。
关于haskell - Semigroupoid 和 Semigroup 类之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42468135/
我正在尝试做 Haskell Book 中的半群练习之一(第 15 章,“幺半群,半群”)但我陷入了困境。现给出如下: newtype Combine a b = Combine { unComb
我想实现一个名为 ComplexNumber 的自定义数据类型,如下所示:数据 ComplexNumber a = C (a,a) 现在我想实现 Monoid 变量并定义二进制 mempty 元素和
上周我一直在努力掌握 Haskell 的一些“核心”类型和类型类(但总共学习 Haskell 的时间最多两周),我发现了一些让我烦恼的事情: “Semigroupoid”是“Category”的概括,
在以下堆栈脚本中,我无法应用我的 strangeHeadMay函数到 NonEmpty列表,但它在常规列表上工作正常。 #!/usr/bin/env stack {- stack script --n
我的讲师给我的代码不是在 GHCI 中构建的。据我所知,我的同学们的构建是正确的。 我引用的代码是 import Data.Semigroup (Semigroup ((<>))) GHCI 向我抛
为什么 Monoid 实例需要 (Ord a, Ord b) 约束而 Semigroup 实例不需要? 这取决于 Category.Constrained 类还是使用 GADT 来定义数据类型? {-
我正在尝试将我的头围绕在 Cats 中的 Semigroupals 上。以下是 Underscore 的“Scala with Cats”中的陈述。 cats.Semigroupal is a typ
Monads定义 Semigroups通过 instance Monad m => Semigroup (m a) where (<>) = (>>) 使用灵活实例。 如果我想做 Maybe
该程序可以按制造或按年份对列表进行排序。什么是 (<>)? import Data.Semigroup ((<>)) compare = comparing year <> comparing mfg
我的印象是 Validation 可以用作 Monoid/SemiGroup我在 scala 2.9.2 和 scalaz 7 快照下尝试了以下代码 import scalaz._ import Sc
我正在尝试创建代数类型类的“层次结构”,如下所示: class Semigroup a where (.*) :: a -> a -> a foldr1 (.*) = foldl1 (.*)
base Haskell 中的库在 Data.Semigroup 中具有以下类型同义词: type ArgMin a b = Min (Arg a b) type ArgMax a b = Max (
我有一个类型,定义如下: import scalaz._, Scalaz._ case class MyInt(i : Int) 我想创建一个 Semigroup 的实例。我试过这个: object
我正在尝试使用联合操作将 Haskell 整数集定义为 Monoid . module MyMonoid where import qualified Data.IntSet as S data My
Maybe表示可能由于错误而不会产生结果的计算。因此,这样的计算必须是短路的。 现在Maybe的 Semigroup/Monoid 实例似乎打破了这种语义,因为前者偏向于 Just。后者处理错误情况N
我是一名优秀的程序员,十分优秀!