Tag: typeclass

IncoherentInstances如何工作?

玩一些代码 : {-# LANGUAGE FlexibleInstances, OverlappingInstances #-} class Arity f where arity :: f -> Int instance Arity x where arity _ = 0 instance Arity f => Arity ((->) af) where arity f = 1 + arity (f undefined) 没有IncoherentInstances : ghci> arity foldr blah blah ambiguous blah blah possible fix blah ghci> arity […]

在OCaml中Haskell的types类最接近什么?

有什么方法可以完成Haskell的类类在OCaml中的工作? 基本上,我想写一个多态的函数,而不写太多的代码。 做多态的典型方法是提供一个额外的参数,告诉函数是目前正在处理的types。 例如,假设我想对整数列表进行sorting,我必须将一个额外的比较器传递给该函数。 type comparison = Lesser | Equal | Greater my_sort : (a' -> a' -> comparison) -> 'a list -> 'a list 无论如何告诉OCaml,我的types是可比较的,而不用为每种我想要分类的types编写比较器函数? 这意味着我的sortingfunction看起来就像这样: my_sort : 'a list -> 'a list

在Haskell中,为什么没有TypeClass可以像列表一样工作呢?

我正在阅读学习你一个Haskell ,我想知道为什么这么多东西都像列表一样,Prelude中没有任何东西使用types的本地工具来设置它: “字节串的版本:被称为cons它需要一个字节和一个字节串,并且把字节放在开始位置,这很懒,所以即使字节串中的第一个块没有满,它也会产生一个新的块,这就是为什么如果你要在字节串的开头插入大量的字节,最好使用严格版本的缺点。 为什么没有TypeClass 列表或者提供了:函数来统一Data.ByteString , Data.List , Data.ByteString.Lazy等? 这是否有一个原因,或者这只是遗留的Haskell元素? 使用:作为一个例子有点轻描淡写,也来自LYAH: 否则,字节串模块具有类似于Data.List中的函数的负载,包括但不限于头部,尾部,init,空值,长度,映射,反转,foldl,foldr,concat,takeWhile,filter等等

为什么types类很难实现?

Simon在幻灯片30/78上build议,types类的实现一开始就是“绝望”。 有人知道这是为什么吗?

GHC Haskell目前的约束系统有什么问题?

我听说Haskell的“破坏”约束系统存在一些问题,如GHC 7.6及以下。 它出什么问题了? 是否有一个可比的现有系统克服这些缺陷? 例如,edwardk和tekmo都遇到了麻烦(例如tekmo的这个评论 )。

什么是“多态点菜”,我怎样才能从中受益呢?

Rick Hickey在Simple Made Easy的演讲中谈到了“ 多态点菜 ”(约30点到video)。 在同样的背景下,他还提到了Haskell的types类和Clojure的多方法 (和协议)。 由于我对这些概念不是很熟悉,所以我想了解它在实现简单性时的用处。 我对Scala中这个概念的任何例子或展示特别感兴趣。

什么是Haskell的Data.Typeable?

我遇到了Haskell的Data.Typeable引用,但是我不清楚为什么我想在我的代码中使用它。 它解决了什么问题,以及如何解决?

在Haskell中如何派生工作?

Haskell中的代数数据types (ADT)可以通过从它们派生出来自动成为一些类的实例(如Show , Eq )。 data Maybe a = Nothing | Just a deriving (Eq, Ord) 我的问题是,这是如何deriving工作,即如何Haskell知道如何实现派生types派生ADT的function? 另外,为什么只能deriving到某些特定的类? 为什么我不能写我自己的派生类可以派生?

Haskell中的孤立实例

当使用-Wall选项编译我的Haskell应用程序时,GHC会抱怨孤立的实例,例如: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result typesToSElem不是我的,它是由HStringTemplate定义的。 现在我知道如何解决这个问题(将实例声明移动到声明了Result的模块中),我知道为什么GHC宁愿避免孤立的实例 ,但我仍然相信我的方式更好。 我不在乎编译器是否不方便 – 而不是我。 我想在Publisher模块中声明我的ToSElem实例的原因是因为它是依赖于HStringTemplate的发布者模块,而不是其他模块。 我试图保持关注的分离,并避免每个模块都依赖于HStringTemplate。 我认为Haskell的types类的一个优点,比如与Java的接口相比,它们是开放的而不是封闭的,因此实例不必与数据types在同一个地方声明。 GHC的build议似乎是忽略这一点。 所以,我所要找的是要么证实我的思想是正确的,要么忽略/压制这个警告是合理的,要么是一个更有说服力的论点来反对我的做法。

困惑于'Alternative'types的含义及其与其他types的关系

我一直在通过Typeclassopedia来学习types类。 我坚持了解Alternative (和MonadPlus ,就此而言)。 我遇到的问题是: “pedia说:”替代types是用于应用函子,它也有一个monoid结构。“ 我没有得到这个 – 不是替代意味着什么完全不同于Monoid? 即我理解了Alternative类的要点是select两个事物,而我理解Monoid是关于组合事物。 为什么select需要一个empty方法/成员? 我可能是错的,但似乎根本没有被使用…至less在我能find的代码中 。 它似乎不符合课程的主题 – 如果我有两件事情,需要select一个,我需要一个“空”的东西? 为什么Alternative类需要一个Applicative约束,为什么它需要一种* -> * ? 为什么不只有<|> :: a -> a -> a ? 所有的实例仍然可以用相同的方式实现…我想(不知道)。 它提供的Monoid没有什么价值? MonadPlustypes类的重点是什么? 我不能仅仅使用Monad和Alternative东西来解锁它的所有优点吗? 为什么不只是沟渠呢? (我确定我错了,但是我没有任何反例) 希望所有这些问题都是一致的…! 赏金更新:@Antal的答案是一个很好的开始,但是Q3仍然是开放的:Alternative提供的Monoid不是什么? 我觉得这个答案不能令人满意,因为它没有具体的例子,并且对Alternative的较高主观性如何区分它与Monoid有一个具体的讨论。 如果要将应用程序的效果与Monoid的行为结合起来,为什么不只是: liftA2 mappend 这对我来说更令人困惑,因为许多Monoid实例与Alternative实例完全相同。 这就是为什么我正在寻找具体的例子 ,说明为什么select是必要的,以及它与Monoid有什么不同,或者说有什么不同。