[SIMILAR] WITH 19043 elem WITH 16493 families WITH 16170 instance WITH 15598 empty WITH 15525 collection WITH 9791 where WITH 8246 synonym WITH 7055 殊化 WITH 7005 seq WITH 5627 。ty WITH 5545 typedef WITH 3338 class WITH 3250 type WITH 2569 haskell WITH 2079 add WITH 1829 引数 WITH 1285 特殊 WITH 1067 定義 WITH 666 a WITH 622 レク WITH 468 コレ WITH 382 テン WITH 377 invalid WITH 365 クシ WITH 344 ンプ WITH 313 な感 WITH 290 ラス WITH 287 クラ WITH 276 関連 WITH 267 場合 WITH 248 プレ WITH 212 ンク の検索結果 203 件中 1 - 10 件目 (0.07703725 秒)
Invalid Text次はSynonym Families。引数の型によって関連づけられた型を変えたいときに使います。C++でいうところの、特殊化されたテンプレートの中のtypedefとでも言えるでしょうか。 ありがちな例としては、コレクションクラスがあります。 class Collection a where type Elem a empty :: a add :: Elem a ...
しかし、上のような例だと、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 = (< ...
# (スコア:6895)
上の例だと、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 ...
# (スコア:6298)
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 これ ...
# (スコア:6267)
Invalid TextData Familiesは、型パラメータに依って実装を変えたいときに使えます。C++のテンプレートでの特殊化みたいなものでしょうか。 {-# LANGUAGE TypeFamilies #-} import qualified Data.Sequence as Seq data family Vector a -- BoolのVectorはリストで表現 data instance Vector Bool = BoolVector ...
# (スコア:6164)
Type Familiesを使って型レベルで階乗を実装してみます。基本の考え方としては、dataで定義する型が型レベルの値で、type familyで定義する型属が型レベルの関数になります。 まずは、数の定義から。EmptyDataDecls拡張を使います。 {-# LANGUAGE TypeFamilies, EmptyDataDecls, UndecidableInstances, ScopedT ...
# (スコア:5588)
たとえばこんなクラスがあるとして、 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 たと ...
# (スコア:4498)
もっとも簡単そうな方法 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] 簡単だけれど、種類を増やす ...
# (スコア:4270)
IMAPITable::SetColumnsを呼んで取得するカラムを指定するのですが、ここにPR_ENTRYIDを含めておかないとSetColumnsが失敗します。PR_DISPLAY_NAMEとPR_EMAIL_ADDRESSだけ指定したらエラーになってしまいました。 ここにふりがなのカラムを含めれば良いのだとおもうのですが、ふりがな用のタグが定義されていな ...
# (スコア:3879)
Maybeの中の値を元に、Maybe自体をNothingにしたいケースが結構あります。例えば、Maybe Stringで中の文字列が空の場合にはNothingにしたいケースなどです。 nonEmptyString :: Maybe String -> Maybe String nonEmptyString s = case s of Just s | s /= "" -> Just s _ -> Nothing これを少し一般化すると、こ ...
# (スコア:3873)
# (スコア:10000)