[SIMILAR] WITH 30995 prelude WITH 24740 families WITH 16493 synonym WITH 16493 mul WITH 16170 instance WITH 14877 fromintegral WITH 13549 double WITH 13055 where WITH 12751 result WITH 6024 dependencies WITH 5771 functional WITH 5279 int WITH 4239 械的 WITH 3338 class WITH 2726 。cl WITH 2569 haskell WITH 2166 type WITH 1215 機械 WITH 940 き換 WITH 837 実装 WITH 543 換え WITH 531 b WITH 414 に書 WITH 333 a WITH 289 書き WITH 250 出来 WITH 242 を使 WITH 229 使っ WITH 1 [ WITH 1 ] WITH 1 ( WITH 1 5 の検索結果 217 件中 1 - 10 件目 (0.078371571 秒)
Synonym Familiesの別の良くある例はこんな感じのもの。 class Mul a b where type Result a b (*) :: a -> b -> Result a b instance Mul Int Int where type Result Int Int = Int (*) = (Prelude.*) instance Mul Int Double where type Result Int Double = Double (*) x y = fromIntegral Prelude.* y これ ...
Invalid Text次はSynonym Families。引数の型によって関連づけられた型を変えたいときに使います。C++でいうところの、特殊化されたテンプレートの中のtypedefとでも言えるでしょうか。 ありがちな例としては、コレクションクラスがあります。 class Collection a where type Elem a empty :: a add :: Elem a ...
# (スコア:6223)
しかし、上のような例だと、Collectionを型クラスではなくて型構築子クラスにすれば、Synonym Familiesを使わなくても書けます。 class Collection c where empty :: c a add :: a -> c a -> c a instance Collection [] where empty = [] add = (:) instance Collection Seq where empty = Seq.empty add = (< ...
# (スコア:5938)
Invalid TextData Familiesは、型パラメータに依って実装を変えたいときに使えます。C++のテンプレートでの特殊化みたいなものでしょうか。 {-# LANGUAGE TypeFamilies #-} import qualified Data.Sequence as Seq data family Vector a -- BoolのVectorはリストで表現 data instance Vector Bool = BoolVector ...
# (スコア:5410)
Type Familiesを使って型レベルで階乗を実装してみます。基本の考え方としては、dataで定義する型が型レベルの値で、type familyで定義する型属が型レベルの関数になります。 まずは、数の定義から。EmptyDataDecls拡張を使います。 {-# LANGUAGE TypeFamilies, EmptyDataDecls, UndecidableInstances, ScopedT ...
# (スコア:5393)
data Color = RED | BLUE のような型があるときに、この値と整数をマッピングするにはEnumを使うのが楽です。 data Color = RED | BLUE deriving Enum intToColor = toEnum colorToInt = fromEnum ところが、intToColorに範囲外の整数を渡されると例外になってしまってうれしくありません。適当なデフォルト値に ...
# (スコア:5289)
上の例だと、GADTを使っても同じような事ができます。 {-# LANGUAGE GADTs #-} import qualified Data.Sequence as Seq data Vector a where BoolVector :: [Bool] -> Vector Bool IntVector :: Seq Int -> Vector Int add :: a -> Vector a -> Vector a add v (BoolVector l) = BoolVector $ v:l add v (IntVe ...
# (スコア:5281)
Rubyで関数プログラミングっぽく書くためのライブラリ。 ...
# (スコア:4902)
たとえばこんなクラスがあるとして、 class ToString a where toString :: a -> String 以下の型にインスタンスを宣言することを考えます。 newtype Wrap a = Wrap a 普通のインスタンス宣言は、たとえばこんな感じ。 instance Show a => ToString (Wrap a) where toString (Wrap x) = "Normal:" ++ show x たと ...
# (スコア:3671)
もっとも簡単そうな方法 data Animal1 = Dog1 String | Cat1 String Int call1 :: Animal1 -> String call1 (Dog1 name) = name call1 (Cat1 name whiskers) = name ++ " with " ++ show whiskers ++ " whiskers" test1 = mapM_ (putStrLn . call1) [Dog1 "pochi", Cat1 "tama" 12] 簡単だけれど、種類を増やす ...
# (スコア:3563)
# (スコア:10000)