たとえば、次のように柔軟なネストを可能にするリスト型を作成したいとします。
[[['a'],'a'],'a']
Haskellでこれを実装することは可能でしょうか? その型シグネチャを書くにはどうすればよいですか?どんな助けでも素晴らしいでしょう!!!
たとえば、次のように柔軟なネストを可能にするリスト型を作成したいとします。
[[['a'],'a'],'a']
Haskellでこれを実装することは可能でしょうか? その型シグネチャを書くにはどうすればよいですか?どんな助けでも素晴らしいでしょう!!!
さまざまな値コンストラクターを使用して、独自のデータ型を定義する必要があります。
からghci
:
Prelude> data Val a = Val a | List [Val a] deriving (Show)
Prelude> [List [List [Val 'a']], Val 'a']
[List [List [Val 'a']],Val 'a']
そしてそのタイプ:
Prelude> :t [List [List [Val 'a']], Val 'a']
[List [List [Val 'a']], Val 'a'] :: [Val Char]
また、実世界の Haskell で JSON がどのように表現されるかを確認してください: http://book.realworldhaskell.org/read/writing-a-library-working-with-json-data.html
(検索しdata JValue
て関連するデータ型を見つけてください)
これはリストではなく、ツリーです。そのため、ツリー データ型で表すことができます。1 つの例はのバラの木でcontainers
、その定義はおおよそ次のとおりです。
data Tree a = Node a [Tree a]
しかし、この場合のより適切なツリータイプは、次のようなものになるでしょう (ちなみにこれは のfree モナドです[]
; バラの木はcofree comonad です):
data Tree a = Leaf a | Node [Tree a]
このタイプを使用すると、次のように「リスト」を表すことができます。
Node [Node [Node [Leaf 'a'], Leaf 'a'], Leaf 'a']