2016-06-19 14 views
3

나는 임의의리스트를 가져 와서 하나가 다른리스트의 서브리스트인지를 비교하는 함수를 작성하고있다. stdin의 경우 사용자에게 두 개의 목록을 요청했지만 임의의 유형을 허용하는 방법을 찾을 수는 없습니다.Haskell의 임의 유형 [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

사용자가 입력 할 수있는 것과 입력을 해석 할 유형에 대한 몇 가지 예를 제공하십시오. – ErikR

+0

좋은 아이디어, 나는 그들을 –

+0

에 추가 할 수 있습니다. 사용자가 다음을 입력 할 수 있습니까? [1, 2, "cat"]'? – ErikR

답변

4

read은 사전에 어떤 종류의 것을 읽고 있는지 알고 있어야합니다. 그것이 작동하는 방식입니다.

아니요read이 반환 할 문자를 결정하는 경우입니다. 예를 들어 고려 :

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

첫 번째 읽기는 플로트 (1.0)과 지능 (1) 문자열이 읽을 경우에도 두 번째는 정확히 동일을 반환합니다.

는이 같은 당신이 "[1,2,3]"을 평가 및 번호를 얻을 수있는 목록과 평가 "5"을 얻을 당신이 돌아갈 것은 어떤 종류의 평가 말할 필요가 없습니다 수 파이썬과 같은 다른 언어, 다른 생각할 수 있습니다.

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

는 따라서 가능한 표현의 우주가 닫혀 그러나, 그것과 하스켈의 대답은 그 언어는 정말로 단지 같은 합 형에게 있습니다 유형을 다루고있다. 그래서 실제로 eval은 어떤 종류의 내용을 읽고 있는지 알고 있습니다. Haskell에서는 언제나 새로운 타입을 추가 할 수 있기 때문에 새로운 독자와 쇼 기능을 추가 할 수 있습니다.

2

근본적인 문제는 하스켈에 독립적입니다. 단순히 값의 두 문자열 표현을주는 것만으로는 평등을 결정하기에 충분하지 않습니다. 하나의 문자열이 여러 가지 방법으로 해석 될 수 있기 때문에 그 값의 해석이 무엇이되어야 하는지를 그 사람에게 말해야합니다. 예를 들어

, 나는 다음과 같은 입력

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

당신은 무엇을 반환해야

당신에게의 말을하자? 대소 문자를 구분하는 표준 문자를 사용하여이 해석을 의미한다면 다시 False으로 가야합니다. 반면에 대소 문자를 구분하지 않는 문자 (예 : this package에 의해 제공됨)를 사용하고 있다면 True을 다시 받아야합니다. 그냥 문자열 표현을주는 것은 모호합니다.

신경 쓰이는 것이 문자열 표현 그 자체라면 read 값을 문자열 목록에 넣은 다음 해당 값을 sublist으로 지정하십시오. 해당 문자열의 해석에 관심이 있다면 사용자가 해당 해석을 지정하도록 허용하거나 코드에서 해석을 지정해야합니다 (@ ErikR의 ADT 인코딩과 유형 주석은 두 가지 가능성이 있습니다).