Haskellで異種リストの表示を定義する方法

user1685095

私はHaskellが依存型への道で何を提供できるかを読んで研究していThinking with typesます。

これがGADTとして定義された異種リストです。

data HList (ts :: [Type]) where
    HNil :: HList '[]
    (:#) :: t -> HList ts -> HList (t ': ts)

infixr 5 :#

instance Eq (HList '[]) where
    HNil == HNil = True

instance (Eq t, Eq (HList ts)) => Eq (HList (t ': ts)) where
    (a :# as) == (b :# bs) = a == b && as == bs


instance Ord (HList '[]) where
    compare HNil HNil = EQ

instance (Ord t, Ord (HList ts)) => Ord (HList (t ': ts)) where
    compare (a :# as) (b :# bs) = case compare a b of
                                    EQ -> compare as bs
                                    x -> x

instance Show (HList '[]) where
    show HNil = "[]"

instance (Show t, Show (HList ts)) => Show (HList (t ': ts)) where
    show xs = "[" ++ (show' xs "") ++ "]"
        where
            show' (y :# ys) prefix = prefix ++ (show y) ++ rest
                where rest = case  of
                               HNil -> ""
                               _ -> show' ys ", "

これが私が得るエラーです。

    • Occurs check: cannot construct the infinite type: ts2 ~ t1 : ts2
      Expected type: HList ts2 -> [Char] -> [Char]
        Actual type: HList ts1 -> p -> p1
    • In the expression: show' ys ", "
      In a case alternative: _ -> show' ys ", "
      In the expression:
        case ys of
          HNil -> ""
          _ -> show' ys ", "
    • Relevant bindings include
        ys :: HList ts2 (bound at src/Lib.hs:43:25)
        y :: t1 (bound at src/Lib.hs:43:20)
   |
46 |                                _ -> show' ys ", "

私はHListソースコードを読みましたが、それらが行うことは、返される文字列でパターンマッチを行う醜いハックでshow ysあり、それが等しい場合[]基本的に再帰を停止します。これはハックと見なされます。

支出

独自のカスタムクラスを定義し、そのクラスを繰り返し使用すると、より簡単になります。これは、prefix引数を標準showメソッドに渡すことができないためですが、これはカスタムクラスでは問題ではなくなりました。

class HShow ts where
    hshow :: HList ts -> String -> String

instance HShow '[] where
    hshow HNil _ = ""

instance (Show t, HShow ts) => HShow (t ': ts) where
    hshow (y :# ys) p = p ++ show y ++ hshow ys ", "

その後、角かっこを追加して、標準Showクラスインスタンスを取得できます。

instance HShow ts => Show (HList ts) where
    show xs = "[" ++ hshow xs "" ++ "]"

test :: HList '[ Int, Char, Bool ]
test = 42 :# 'a' :# True :# HNil

-- > test
-- [42, 'a', True]

型族に基づく代替案。特に単純ではありません。

type family All (c :: a -> Constraint) (xs :: [a]) :: Constraint where
  All c '[] = ()
  All c (x ': xs) = (c x, All c xs)

hshow :: All Show ts => HList ts -> String
hshow HNil        = ""
hshow (x :# HNil) = show x
hshow (x :# xs  ) = show x ++ ", " ++ hshow xs

instance All Show ts => Show (HList ts) where
  show xs = "[" ++ hshow xs ++ "]"

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Haskellでリストを定義する

分類Dev

Javaで異種リストをソートする方法は?

分類Dev

Haskellの異種リストで安全なルックアップを入力する

分類Dev

リストアイテムが異種であるrecyclerviewのクリックリスナーを設定する方法

分類Dev

異なる方法C#でオブジェクトのリストを定義しますか?

分類Dev

Javaで2つ以上の異種オブジェクトを含むリストをソートする方法は?

分類Dev

型クラスを作成する方法は、scalaの異種リストで機能します

分類Dev

composer.jsonで定義されたComposerスクリプトを使用して、phpunitの色を表示する方法は?

分類Dev

種マトリックスごとにサイト内の植物種バイオマスを表示する方法は?

分類Dev

Haskellの関数への再帰呼び出しのリストを定義する方法

分類Dev

リストをHaskellに含めることができる長さの定義

分類Dev

.NETチャートクラス-同じチャートに異なる種類の間隔を表示する方法

分類Dev

Scalaの異種リスト; マップ機能を使用する

分類Dev

異種アイテムのリストを表示するときに採用する設計アプローチ

分類Dev

定義されたマージンで異なる行のテキストを整列する方法

分類Dev

RequireJSで「メイン」スクリプトのタイプを定義する方法

分類Dev

NodeJS:異なる2つの方法でビューディレクトリを定義します

分類Dev

異種リストのインスタンスを表示

分類Dev

R:プロットの凡例で複数の線種スタイルの順序を定義する

分類Dev

リストで定義されたTuplesをreverseする方法は?

分類Dev

ユーザー定義リストでIN句を使用する方法

分類Dev

複数の異なる種類の文字列のリストから目的の値を取得する方法

分類Dev

どのようにJavaで異なる種類のリストを作成する多型を使用するには?

分類Dev

haskellのリストで最短リストを取得する方法

分類Dev

リストの半束を定義する方法は?

分類Dev

XSDでバイト配列のリストを定義する

分類Dev

魚の殻でエイリアスを定義する方法は?

分類Dev

Android で EditText の異なる色と幅を定義する方法

分類Dev

「newtype」の引数でHaskell関数を定義する方法は?

Related 関連記事

  1. 1

    Haskellでリストを定義する

  2. 2

    Javaで異種リストをソートする方法は?

  3. 3

    Haskellの異種リストで安全なルックアップを入力する

  4. 4

    リストアイテムが異種であるrecyclerviewのクリックリスナーを設定する方法

  5. 5

    異なる方法C#でオブジェクトのリストを定義しますか?

  6. 6

    Javaで2つ以上の異種オブジェクトを含むリストをソートする方法は?

  7. 7

    型クラスを作成する方法は、scalaの異種リストで機能します

  8. 8

    composer.jsonで定義されたComposerスクリプトを使用して、phpunitの色を表示する方法は?

  9. 9

    種マトリックスごとにサイト内の植物種バイオマスを表示する方法は?

  10. 10

    Haskellの関数への再帰呼び出しのリストを定義する方法

  11. 11

    リストをHaskellに含めることができる長さの定義

  12. 12

    .NETチャートクラス-同じチャートに異なる種類の間隔を表示する方法

  13. 13

    Scalaの異種リスト; マップ機能を使用する

  14. 14

    異種アイテムのリストを表示するときに採用する設計アプローチ

  15. 15

    定義されたマージンで異なる行のテキストを整列する方法

  16. 16

    RequireJSで「メイン」スクリプトのタイプを定義する方法

  17. 17

    NodeJS:異なる2つの方法でビューディレクトリを定義します

  18. 18

    異種リストのインスタンスを表示

  19. 19

    R:プロットの凡例で複数の線種スタイルの順序を定義する

  20. 20

    リストで定義されたTuplesをreverseする方法は?

  21. 21

    ユーザー定義リストでIN句を使用する方法

  22. 22

    複数の異なる種類の文字列のリストから目的の値を取得する方法

  23. 23

    どのようにJavaで異なる種類のリストを作成する多型を使用するには?

  24. 24

    haskellのリストで最短リストを取得する方法

  25. 25

    リストの半束を定義する方法は?

  26. 26

    XSDでバイト配列のリストを定義する

  27. 27

    魚の殻でエイリアスを定義する方法は?

  28. 28

    Android で EditText の異なる色と幅を定義する方法

  29. 29

    「newtype」の引数でHaskell関数を定義する方法は?

ホットタグ

アーカイブ