0

たとえば、次のように柔軟なネストを可能にするリスト型を作成したいとします。

[[['a'],'a'],'a']

Haskellでこれを実装することは可能でしょうか? その型シグネチャを書くにはどうすればよいですか?どんな助けでも素晴らしいでしょう!!!

4

2 に答える 2

2

さまざまな値コンストラクターを使用して、独自のデータ型を定義する必要があります。

から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て関連するデータ型を見つけてください)

于 2013-07-26T19:55:41.460 に答える
2

これはリストではなく、ツリーです。そのため、ツリー データ型で表すことができます。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']
于 2013-07-26T19:57:20.010 に答える