2

私は現在、intと文字列を同時に処理できる独自の構造を作成しています。

何かのようなもの

data Collection = One Int | Two String | Three(Collection)(Collection)

しかし、私は自分の構造をリストに変換できる関数を書き込もうとしていました。

私はこれが不可能だと思っているのは正しいですか。デフォルトでは次のようになっているからです。

[1,2、"テスト"]

コンソールで機能しないため、私の関数は常に失敗しますか?

4

3 に答える 3

6

あなたはおそらくただ定義する必要があります

type Collection = [Either Int String]

次に、行う代わりに

l = [1,2,"test"]

できるよ

l :: Collection
l = [Left 1, Left 2, Right "test"]

3つ以上のタイプが必要な場合は、独自のメンバータイプを定義する必要があります。だからあなたもこのようなことをするでしょう

data MemberType = MyInt Int | MyString String | MyFloat Float deriving Show
type Collection = [MemberType]
l :: Collection
l = [MyInt 1, MyInt 2, MyString "test", MyFloat 2.2]

必須ではありませんが、リストを適切な方法で印刷するderiving Showために簡単に実行できるのは素晴らしいことです。print l

于 2012-09-18T22:14:40.167 に答える
4

データ構造は基本的に、各リーフにIntまたはを格納する二分木です。Stringこのツリーのトラバーサルは当然[Either Int String]です。

于 2012-09-18T22:05:46.707 に答える
2

Haskellのリストは1つのタイプしか持てません。リストで複数のタイプを処理する場合は、元のタイプを抽出して処理する関数とともに、リストに追加する両方のタイプを表すことができる新しいラッパータイプを作成する必要があります。たとえば、を使用できますEither

于 2012-09-18T22:03:37.970 に答える