matsubara0507
Topic Request で OK です
(:) 演算子みたいなものを作りたいのですが、どこかのパッケージで定義されていたりしないでしょうか。
class KList (f :: k -> *) (g :: [k] -> *)
where
(<:<) :: f x -> g xs -> g (x ': xs)
-- 利用例 (実際にはSingではなく情報のある型を使いたい)
instance KList Sing Sing
where
x <:< y = SCons x y
main =
do
let s = (sing :: Sing "orange") <:< (sing :: Sing '["apple", "grape"])
print $ fromSing s
(/) と fromRational なので、「可除数」とかじゃダメですか。f x の形をしている必要はない事に気づいたので、APIを工夫して左辺が g xs -> g (x:xs) になるようにして、ユーザーには $ 演算子で適用してもらう事にしました。具体型とは、型引数を1つも取らない型か、あるいは、型引数を取るけれどもそれが全て埋まっている型のことを指します。これについて、
hoge :: [a] -> b の [a] などを想像していいものでしょうか?またはこの時の b も?(->) や ([a] ->) がそれに該当し、型コンストラクタではあるが具体型ではない。また「型」という語には具体型のみを指す場合と、それ以外のものも含む場合があり、文脈に気を付けること( Maybe a でなく Maybe を型と呼ぶ場合がある、という話)(->) や ([a] ->) が「埋められていない型引数がある型」ですね(->) って型コンストラクタなんですか…?と思ったらすごいH本のp231にその旨の記載がありますね…その周辺をざっと読んだ限りFunctorまで読めばこの疑問は解決しそうな気がしてきました。id の型は a -> a ですが、拡張を使えば forall a. a -> a と書けて forall a. T のような型を全称型といいます。Int Maybe Int Maybe a など、そうではない型コンストラクタは Maybe のことですね。混乱したらカインドを考えて、カインドが * のものが「具象型」と思うのがわかりやすい気がします。print =<< readArray arr n で n じゃなくて i じゃね?* を「零項の型コンストラクタ」というのは気に入りました、1以上の項の型コンストラクタを指す特別な用語がない、というのも何となく納得です。すごいH本にカインドの記述が見られなかったのでFunctorを説明しているあたりにあるはずですよ!
ViewPatterns , OverloadedStrings を使えば先頭からxxxとかのマッチはできると思います。ViewPatterns 覚えないと。