2016-10-28 18 views
3

入力文字列を直接リストに変換する方法はありますか?Haskell:入力文字列を直接リストに変換する

は、入力文字列は、リストなどの形で、すでに次のとおりです。

[((1,2),x),((3,2),y)] 
私はすべての値を取得するには、文字列経由することなく、他の関数で使用することができ [((1,2),x),((3,2),y)]に変換したい

同じリストを作成します。

これは可能ですか?

+0

'x'と' y'は何ですか? – leftaroundabout

+1

あなたは 'read'を求めていますか? – melpomene

+0

xとyは私が自分自身を定義したタイプです。 読み取りは数値の文字列をint型に変換するためだけではありませんか? –

答えて

3

あなたのタイプにReadインスタンスを定義するだけで済みます。

> data Animal = Dog | Cat deriving (Read, Show) 
> read "[((1,2),Dog),((3,2),Cat)]" :: [((Int, Int), Animal)] 
[((1,2),Dog),((3,2),Cat)] 
+0

ありがとうございました!完璧に働いた!グーグルの時間は、まだ解決策はとてもシンプルです...もう一度おねがいします! –

2

述べたように、あなたはAnimalReadのインスタンスで提供する、あなたのStringはタイプ[((Int, Int), Animal)]の値に変換するreadを使用することができます。インスタンスが自動的に導出することができます。

data Animal = Dog | Cat deriving (Show, Read) 

別の潜在的な落とし穴が明示的にreadを解析するために知っているあなたは型注釈を指定する必要があることであるために:

main :: IO() 
main = 
    do let list = read "[((1,2),Dog),((3,2),Cat)]" :: [((Int, Int), Animal)] 
     animals = map snd list 
    print animals 

出力:

$ runhaskell test.hs 
[Dog,Cat] 
+0

ありがとう!タイプ注釈が機能しているかどうかを指定する必要がありますか、それとも主に安全性のためですか/将来のエラーを防ぐのでしょうか? –

+0

'read'の型を見てください:' read :: Read a => String-> a'。型変数 'a'を(readを型をクリアするコンテキスト内で' read'の結果を使って)完全に明瞭にするように制約すると、コンパイラはどの 'Read'インスタンスを使用するのかを知り、注釈を追加する必要はありません。他のケースでは、上のコードのように、型変数があいまいであると不平を言うでしょう。 – dkasak

+0

さようなら!ありがとうございました –

関連する問題