Questions tagged «typeclass»

Haskell中的类型类是一种支持即席多态性的语言机制。它们也存在于Scala,Coq和Isabelle中。

10
Java的接口和Haskell的类型类:区别和相似之处?
当我学习Haskell时,我注意到它的type class,这应该是源自Haskell的伟大发明。 但是,在Wikipedia页面上,类型为class: 程序员通过指定一组函数或常量名称以及它们各自的类型来定义类型类,对于每个属于该类的类型,它们必须存在。 这似乎与Java的界面非常接近对我来说,(引用Wikipedia的Interface(Java)页面): Java编程语言中的接口是一种抽象类型,用于指定类必须实现的接口(在通用意义上)。 这两个看起来很相似:类型类限制类型的行为,而接口限制类的行为。 我想知道Haskell中的类型类和Java中的接口之间有什么区别和相似之处,或者根本上有区别吗? 编辑:我注意到什至haskell.org也承认它们是相似的。如果它们是如此相似(或者是?),那么为什么用此类炒作来处理类型class? 更多编辑:哇,这么多好答案!我想我必须让社区决定哪一个是最好的。但是,在阅读答案时,所有的人似乎都只是说:“ typeclass可以做很多事情,而interface不能或不必应付泛型”。我不禁想知道,接口有什么可以做而类型类不能做吗?另外,我注意到Wikipedia声称typeclass最初是在1989年的论文中发明的*“如何使ad hoc多态性减少ad hoc”,而Haskell仍处于摇篮中,而Java项目始于1991年并于1995年首次发布因此,也许不是typetype与接口类似,而是接口受typeclass影响?是否有任何文件/文件支持或反对?感谢所有答案,它们都非常有启发性! 感谢您的所有投入!

2
Haskell中的Comonad类型类是什么?
Haskell中的Comonad类型类是什么?与Control.Comonad的comonad包中的Comonad一样(也欢迎对提供Comonad类型类的任何其他包进行解释)。我隐约听到了Comonad的信息,但我真正了解的只是它提供的东西extract :: w a -> a,与Monad的相似return :: a -> m a。 在“真实”代码中指出Comonad的“真实生活”用法的加分点。

3
在Haskell中派生如何工作?
Haskell中的代数数据类型(ADT)可以自动成为某些 typeclass的实例(例如Show,Eq所)获得来自他们。 data Maybe a = Nothing | Just a deriving (Eq, Ord) 我的问题是,这是如何deriving工作的,即Haskell如何知道如何为派生的ADT实现派生的类型类的功能? 还有,为什么 deriving限于某些类型类?为什么我不能编写自己的派生类?

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

4
为什么不能使String成为类型类的实例?
鉴于: data Foo = FooString String … class Fooable a where --(is this a good way to name this?) toFoo :: a -> Foo 我想创建String一个实例Fooable: instance Fooable String where toFoo = FooString 然后,GHC抱怨: Illegal instance declaration for `Fooable String' (All instance types must be of the form (T t1 ... …

1
MonadPlus,Alternative和Monoid类型类之间的区别?
标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义: 空值:mzero,empty或mempty。 操作a -> a -> a:在该类型类联接值加在一起mplus,<|>或mappend。 这三个规则均指定了实例应遵循的以下法律: mempty `mappend` x = x x `mappend` mempty = x 因此,似乎三个类型类都提供相同的方法。 (Alternative也提供some和many,但是它们的默认定义通常就足够了,因此,在这个问题上它们并不是太重要。) 所以,我的查询是:为什么这三个类非常相似?除了它们不同的超类约束之外,它们之间是否还有真正的区别?

5
Haskell类型阻碍了简单的“平均”功能
我正在与初学者Haskell玩耍,我想编写一个平均函数。好像是世界上最简单的事情,对吧? 错误。 似乎Haskell的类型系统禁止平均值在通用数字类型上工作-我可以让它在整数列表或小数列表上工作,但不能同时在两者之间工作。 我想要: average :: (Num a, Fractional b) => [a] -> b average xs = ... 但是我只能得到: averageInt :: (Integral a, Fractional b) => [a] -> b averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs) 要么 averageFrac :: (Fractional a) => [a] -> a averageFrac xs …


1
什么是“点菜多态”,我如何从中受益?
瑞克·希基(Rick Hickey)在他的演讲“简单易用”中谈到“点菜多态”(视频中约30:00)。在同一上下文中,他还提到了Haskell的类型类和Clojure的多方法(和协议)。 由于我对这些概念不是很熟悉,因此我想了解它在尝试实现简单性时的用处。我对Scala中有关此概念的任何示例或展示特别感兴趣。

11
Scala双重定义(2种方法具有相同的类型擦除)
我在scala中编写了此代码,但无法编译: class TestDoubleDef{ def foo(p:List[String]) = {} def foo(p:List[Int]) = {} } 编译器通知: [error] double definition: [error] method foo:(List[String])Unit and [error] method foo:(List[Int])Unit at line 120 [error] have same type after erasure: (List)Unit 我知道JVM没有对泛型的本机支持,所以我理解此错误。 我可以写包装器List[String],List[Int]但是我很懒:) 我对此表示怀疑,但是还有另一种表达方式与之List[String]不同List[Int]吗? 谢谢。

5
被“替代”类型类的含义及其与其他类型类的关系所迷惑
我一直在学习Typeclassopedia来学习类型类。我一直无法理解Alternative(并且MonadPlus,对此)。 我遇到的问题: 'pedia说:“ Alternate类型类适用于也具有类半体结构的Applicative函数。” 我不明白这一点-“替代”是否意味着与Monoid完全不同?也就是说,我理解Alternative类型类的要点是在两件事之间进行选择,而我将Monoids理解为要结合事物。 为什么Alternative需要一个empty方法/成员?我可能是错的,但似乎根本没有使用它……至少在我能找到的代码中。而且这似乎与课程的主题不符-如果我有两件事,并且需要选择其中一件事,我需要做什么? 为什么Alternative类型类需要一个Applicative约束,为什么它需要一种* -> *?为什么不只是拥有<|> :: a -> a -> a?所有实例仍然可以以相同的方式实现...我认为(不确定)。Monoid不提供什么值? 什么是点MonadPlus式类?我不能仅通过同时使用aMonad和a来释放其所有优点Alternative吗?为什么不干掉它呢?(我确定我错了,但是我没有任何反例) 希望所有这些问题都是连贯的……! 赏金更新:@Antal的答案是一个不错的开始,但是Q3仍然是公开的:Alternative提供了Monoid没有提供什么?我发现此答案不尽人意,因为它缺少具体的示例,并且对另类的更高种类如何将其与Monoid进行了具体讨论。 如果要将应用程序的效果与Monoid的行为结合起来,为什么不做: liftA2 mappend 这让我更加困惑,因为许多Monoid实例与Alternative实例完全相同。 这就是为什么我要寻找一些特定的示例,这些示例说明了为什么需要“替代”,以及与Monoid有何不同(或意味着不同)。

1
导出具有量化约束的Ord(总a。Ord a => Ord(fa))
有了量化的约束,我可以得出Eq (A f)结论吗?但是,当我尝试导出Ord(A f)时会失败。当约束类具有超类时,我不理解如何使用量化约束。我如何派生Ord (A f)以及其他具有超类的类? > newtype A f = A (f Int) > deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f) > deriving instance (forall a. Ord a => Ord (f a)) => Ord (A f) <interactive>:3:1: error: • Could not deduce …

1
创建一个完全依赖的串联
关于串联的一个很好的真实事实是,如果我知道方程式中的任何两个变量: a ++ b = c 那我知道第三个。 我想在我自己的concat中抓住这个想法,所以我使用了功能依赖。 {-# Language DataKinds, GADTs, FlexibleContexts, FlexibleInstances, FunctionalDependencies, KindSignatures, PolyKinds, TypeOperators, UndecidableInstances #-} import Data.Kind (Type) class Concatable (m :: k -> Type) (as :: k) (bs :: k) (cs :: k) | as bs -> cs , as cs -> bs , …

1
为什么“约束技巧”在此手动定义的HasField实例中不起作用?
我有使用镜头和GHC.Records的此代码(很奇怪): {-# LANGUAGE DataKinds, PolyKinds, FlexibleInstances, UndecidableInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Main where import Control.Lens import GHC.Records data Glass r = Glass -- just a dumb proxy class Glassy r where the :: Glass r instance …

1
Haskell中的隐式静态类型强制转换(强制)
问题 在Haskell中考虑以下设计问题。我有一个简单的符号EDSL,我想在其中表达变量和一般表达式(多元多项式),例如x^2 * y + 2*z + 1。另外,我想在表达式(例如x^2 + 1 = 1)和定义(例如)上表达某些符号方程式x := 2*y - 2。 目标是: 变量和通用表达式具有单独的类型-某些函数可能会应用于变量,而不是复杂的表达式。例如,定义运算符:=可能是类型, (:=) :: Variable -> Expression -> Definition并且不应该将复杂的表达式作为其左侧参数传递(尽管应该可以将变量作为其右侧参数传递,而无需显式转换) 。 将表达式作为的实例Num,这样就可以将整数文字提升为表达式,并为常见的代数运算(如加法或乘法)使用方便的表示法,而无需引入一些辅助包装运算符。 换句话说,我希望对表达式进行变量的隐式和静态类型转换(强制转换)。现在,我知道这样,Haskell中没有隐式类型强制转换。但是,某些面向对象的编程概念(在这种情况下为简单继承)可以在Haskell的类型系统中表达,无论有没有语言扩展。如何在保持轻量级语法的同时满足以上两个条件?可能吗 讨论区 显然,这里的主要问题是Num类型限制,例如 (+) :: Num a => a -> a -> a 原则上,可以为变量和表达式编写单个(通用)代数数据类型。然后,可以这样写:=:区分左侧表达式,只接受变量构造函数,否则会出现运行时错误。但是,这不是一个干净的静态(即编译时)解决方案... 例 理想情况下,我想实现一种轻量级语法,例如 computation = do x <- variable t …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.