2011-05-04 6 views
5

나는 haskell의 typeculus에서 데이터를 얻는 방법에 대해 정말로 혼란스러워합니다. 나는 C 배경으로 갈 것이기 때문에 당신은 단지 데이터에 접근 할 수 없다는 것을 찾기가 정말 어렵다. 내가 가진 것은 다음과 같습니다 :Haskell에서 데이터 타입 목록 만들기

data MyType = MyType String deriving (Show) 


display :: [MyType] -> IO() 
display ((MyType name):xs) = do 
     display xs 
     putStr name 

기본적으로 여기서 'name'에 액세스하고 싶지만 작동하지 않습니다. 내 코드에서 객체에 대한 참조만으로 typeclass 인스턴스 내의 데이터에 액세스 할 수 있습니까? 아니면 그 내용을 변수에 매핑해야합니까? 만약 그렇다면 어떻게?

좋은 튜토리얼에 대한 링크는 '내가 좋은 점을 알기 위해 하스켈을 배웁니다.'라고 읽었습니다.하지만 주어진 예제에서 벗어나려고 할 때마다 항상 알 필요가있는 것처럼 보입니다. 끝났어. -A

답변

6

나는 모든 것을 하나로 묶은 작은 조각들을 놓치고 있을지도 모른다.

data MyType = MyType String deriving (Show) 

지금, 당신이가는대로 각 요소를 인쇄, 같은 유형의 목록을 산책 함수를 작성하려면 :

첫째, 당신은 문자열을 보유하고 완벽하게 정상적으로 데이터 유형, MyType을 보유하고 있습니다. 목록 데이터 유형에 대한 재귀를 통해이 작업을 수행합니다. 난 당신의 일부 데이터를 구축했다 붙어 갈 것 같아 이제

display :: [MyType] -> IO() 
display []     = return() 
display ((MyType name):xs) = do 
     putStrLn name 
     display xs 

: 목록이 두 케이스, 빈리스트, []과 단점의 경우, (:)을 가지고 있기 때문에

, 우리는 두 개의 지점을 가지고 이 유형. 패턴 매칭을 통해 패턴을 분리하는 방법을 이미 알고 있으며 거의 ​​동일한 구문을 사용하여 데이터를 빌드합니다. 여기 MyType의 목록입니다 :

table = 
    [ MyType "john" 
    , MyType "don" 
    , MyType "eric" 
    , MyType "trevor" 
    ] 

마지막으로 main

main = display table 

주에서 프로그램을 실행할 수 있습니다 (data 도입) 단지 대수 데이터 유형, 여기에는 typeclasses 없습니다.

+0

동적으로 MyType을 목록에 추가하는 기능은 무엇입니까? 무언가를 처리하는 함수를 상상해보십시오. MyType으로 변환 한 일부 문자열을 가져 와서 MyTypes의 전역 목록에 추가해야합니다. 어떻게 할 수 있습니까? –

1

우선, 내가 사용하는 단어에 대해 약간 혼란 스럽습니다. typeclass은 함수를 오버로드하는 방법입니다. 가지고있는 것은 대수 데이터 형식입니다. 당신이 가진 문제는 (내가 정확히 이해한다면) 잘 알려져 있습니다.

data Foo = Foo { 
    bar :: Int 
    , baz :: String 
} 

당신이 C의 구조체에 유사성을 볼 수 있나요 : 쉽게 데이터에 액세스의 목적을 위해, 당신은 기록 구문를 사용할 수 있을까? 레코드 구문을 사용하면 몇 가지 흥미로운 것들이 가능합니다 :

bar y -- access member bar of y 
y { bar = z } -- Make a new record but with field bar changed to the value of z 

그리고 다른 것들도 가능합니다.

+0

레코드 구문은 모든 필드가 데이터 형식의 인스턴스에서 해당 필드를 추출 할 때 같은 이름의 함수를 발생시키기 때문에 C 구조체 구문에서 나옵니다. 위의 경우'bar :: Foo -> Int'와'baz :: Foo -> String'을 얻을 수 있습니다. 결과적으로, 당신은'bar' 나'baz'라는 이름의 필드를 가진 같은 모듈에 다른 레코드를 생성 할 수 없다. 왜냐하면 그 결과 함수를 위해 하나 이상의 타입을 가질 수 없기 때문이다. – pat