タグ付けされた質問 「typeclass」

10
JavaのインターフェースとHaskellの型クラス:違いと類似点?
Haskellを学んでいると、その型クラスに気づきました。これはHaskellから生まれた優れた発明であるはずです。 ただし、タイプクラスのWikipediaページ: プログラマーは、クラスに属するすべての型に存在しなければならない一連の関数名または定数名をそれぞれの型とともに指定することにより、型クラスを定義します。 私にとってはJavaのインターフェースにかなり近いようです(Wikipediaのインターフェース(Java)ページを引用): Javaプログラミング言語のインターフェースは、クラスが実装しなければならないインターフェース(一般的な意味で)を指定するために使用される抽象型です。 これらの2つはかなり似ています。型クラスは型の動作を制限し、インターフェイスはクラスの動作を制限します。 Haskellの型クラスとJavaのインターフェースの違いと類似点は何でしょうか、それとも根本的に異なるのでしょうか。 編集:私はhaskell.orgでさえそれらが類似していることを認めていることに気づきました それらが非常に類似している(またはそれらがそうである)場合、なぜ型クラスがそのような誇大広告で扱われるのですか? より多くの編集:うわー、とても多くの素晴らしい答え!コミュニティにどちらが最適かを判断させる必要があると思います。しかし、答えを読んでいる間、それらすべては、「型クラスができることはたくさんありますが、インターフェースがジェネリックに対応できないか、ジェネリックに対処する必要がある」とだけ言っているようです。私は疑問に思わずにはいられません、型クラスができないのにインターフェースができることはありますか?また、Wikipediaがtypeclassは元々1989年の論文「アドホックなポリモーフィズムをアドホックから少なくする方法」であると主張していることに気づきました。一方、Haskellはまだ揺りかごのままで、Javaプロジェクトは1991年に開始され、1995年に最初にリリースされました。 。では、タイプクラスがインターフェースに似ているのではなく、その逆に、インターフェースがタイプクラスの影響を受けたのではないでしょうか。これを支持または反証する文書/論文はありますか?すべての回答をありがとう、それらはすべて非常に啓発的です! すべての入力をありがとう!

2
HaskellのComonadタイプクラスとは何ですか?
HaskellのComonadタイプクラスとは何ですか?ComonadのようにcomonadパッケージでControl.Comonad(Comonadの型クラスを提供し、他のパッケージの説明にも歓迎されています)。私は漠然とコモナドについて聞いたことがありますが、私がそれについて本当に知っているのは、それがextract :: w a -> aモナドの一種の類似物を提供することだけですreturn :: a -> m a。 「実際の」コードでのComonadの「実際の」使用に注意することのボーナスポイント。

3
Haskellでの派生はどのように機能しますか?
Haskellの代数的データ型(ADT)は、それらから派生することにより、いくつかのタイプクラス(Show、などEq)のインスタンスになることができます。 data Maybe a = Nothing | Just a deriving (Eq, Ord) 私の質問は、これderivingがどのように機能するか、つまりHaskellが派生ADTの派生型クラスの関数を実装する方法をどのように知るかです。 また、なぜderiving特定の型クラスのみに制限されているのですか?派生可能な独自の型クラスを作成できないのはなぜですか?

6
Haskellの孤立したインスタンス
Haskellアプリケーションを-Wallオプションでコンパイルすると、GHCは孤立したインスタンスについて文句を言います。例: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result 型クラスToSElemは私のものではなく、HStringTemplateによって定義されています。 これを修正する方法(インスタンス宣言をResultが宣言されているモジュールに移動する)と、GHCが孤立したインスタンスを回避する理由を理解しましたが、それでも私の方法の方が優れていると思います。コンパイラが不便であるかどうかは気にしません-私よりもむしろ。 ToSElemPublisherモジュールでインスタンスを宣言する理由は、他のモジュールではなく、HStringTemplateに依存するのはPublisherモジュールだからです。私は関心の分離を維持し、すべてのモジュールがHStringTemplateに依存することを避けようとしています。 Haskellの型クラスの利点の1つは、たとえばJavaのインターフェイスと比較した場合、閉じているのではなく開いているため、インスタンスをデータ型と同じ場所で宣言する必要がないことだと思いました。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それぞれが本質的に同じセマンティクスを持つ2つのメソッドを提供します。 空の値:mzero、empty、またはmempty。 オペレータa -> a -> a:一緒に型クラスの値を結合しmplus、<|>またはmappend。 3つすべてが、インスタンスが準拠する必要がある次の法律を指定します。 mempty `mappend` x = x x `mappend` mempty = x したがって、3つの型クラスはすべて同じメソッドを提供しているようです。 (Alternativeも提供someしてmany、彼らのデフォルトの定義は、通常は十分であるので、彼らはこの質問の面であまり重要ではないです。) だから、私の質問は:なぜこれらの3つの非常に類似したクラスがあるのですか?スーパークラスの制約が異なる以外に、それらの間に実際の違いはありますか?

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
完全に依存する連結を作成する
連結に関する素晴らしい真の事実は、方程式の2つの変数がわかっている場合です。 a ++ b = c 次に、3番目を知っています。 このアイデアを自分の連結に取り込んで、機能的な依存関係を使用したいと思います。 {-# 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インスタンスで「制約トリック」が機能しないのはなぜですか?
lens(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 …

2
newtypeのMArrayインスタンスの再利用
私はこのようなダースをたくさん持っています: newtype MyBool = MyBool Bool newtype MyInt = MyInt Int 既存のインスタンスを再利用したい: instance MArray IOUArray Int IO where ... instance MArray (STUArray s) Int (ST s) where ... これらのインスタンスを実装し、すべての定型コードを取得することは、私が最後に望んでいることです。 私が達成しようとしていることに非常に近いものを見つけました: {-# LANGUAGE GeneralizedNewtypeDeriving, StandaloneDeriving #-} deriving instance MArray IOUArray MyInt IO deriving instance MArray (STUArray s) MyInt (ST s) しかし、それは失敗します: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.