2016-06-19 16 views
3

私は、任意のリストを取り、そのリストを比較して、一方が他方のサブリストであるかどうかを調べる関数を書いています。 stdinについては、ユーザーに2つのリストを尋ねたいと思っていましたが、任意のタイプを受け入れる方法を見つけることはできません。ここに私のコードは、これまでです:Haskellの任意の型[a]のstdinからリストを読み込むには?

1 main :: IO() 
2 main = do 
3  l1 <- getLine 
4  l2 <- getLine 
5  print $ sublist (read l1 :: [Int]) (read l2:: [Int]) 
6 
7 sublist :: Eq a => [a] -> [a] -> Bool 
8 sublist b p = any ((b ==) . take len) . takeWhile ((len<=) . length) $ iterate tail p 
9  where len = length b 

私の主な問題は、私はreadのためのタイプを選択する必要がライン5です。

私は現在、一度に一つをサポートすることができますが、私が持っているしたい入力と出力のいくつかの例:

>>> [1,2,3] 
    [1,2,3,4,5] 
True 

>>> ["a", "bc"] 
    ["xy", "b", "bc"] 
False 

>>> [True, False, True] 
>>> [False, True, False, True] 
True 

-- And even nested types 
>>> [[1], [2,3]] 
    [[2,4], [1], [2,3], [4] 
True 

任意の助けをいただければ幸いです!

+2

ユーザが入力として入力できるものとその入力を解釈するタイプの2つの例を挙げてください。 – ErikR

+0

良いアイデア、私はそれらを追加しました –

+0

ユーザーは次のように入力できます: '[1、2、" cat "]'? – ErikR

答えて

4

readは、それがどのような種類のものであるかを事前に知っていなければなりません。

readが返される文字列を調べる場合。例えば考える:

read "1" :: Float 
read "1" :: Int 

最初の読み出しフロート(1.0)とintは、(1)文字列が読み取られるにもかかわらず、第二にはまったく同じであるが返されます。

これはPythonのように、eval "[1,2,3]"があり、リストと評価版"5"を取得して番号を取得することができ、返すべきことをevalに伝える必要はありません。したがって、可能な表現の宇宙が閉じられている

data PyVal = PyNum Int 
      | PyStr String 
      | PyList [ PyVal ] 
      | PyDict [ (PyStr, PyVal) ] 
      | ... 

:しかし、それにHaskellの答えは、これらの言語は本当に唯一の和タイプのようです種類を扱っているです。実際、evalはどのようなものを読んでいるのか知っています。 Haskellでは、常に新しい型を追加することができ、したがって、新しいreader関数とshow関数を追加できます。

2

基本的な問題は、ハスケルに依存しません。単に値の2つの文字列表現を与えるだけでは、平等を判断するには十分ではありません。 1つの文字列が多くの方法で解釈できるので、それらの値の解釈がどのようなものであるべきかをその人に伝えなければなりません。例えば

、私は次の入力

>>> ['a', 'b'] 
    ['A', 'B'] 

あなたは何を返すべき

あなたを与えるのは、言わせて?大文字と小文字を区別する標準的な文字を使用してこれを解釈することを意味する場合は、 Falseに戻ってください。一方、大文字と小文字を区別しない文字を使用している場合( this packageなど)、 Trueに戻ってください。私に文字列表現を与えるだけではあいまいです。

文字列表現自体が気になる場合は、文字列リストに値を入力してください。sublistを使用してください。その文字列の解釈を気にするなら、その解釈をユーザーが指定できるようにするか、何らかの形でその解釈を指定する必要があります(@ ErikRのADTエンコーディングと型名は2つの可能性があります)。

関連する問題