2012-11-20 4 views
2

나는 학생이고 프로그래밍 과정에서 우리는 하스켈을 배워야한다. 그래서 나는 그것에 익숙하지 않고 많은 경험이 없습니다. 또한 포럼에 질문을 올리는 것에 익숙하지 않습니다.어떻게 하스켈에있는 유형으로 통합 된 함수를 호출 할 수 있습니까?

먼저 라이브러리를 게시 할 예정이므로 함께 사용해야합니다. (DA : 결정적 오토 마톤)

type State = Integer 
type DA = (State, State -> Char -> State, State -> Bool) 
type ListDA = (State, [((State, Char), State)], [State]) 

a :: DA 
a = (0, delta, (==1)) 
    where 
    delta 0 'a' = 1 
    delta 1 'a' = 1 
    delta 2 'a' = 1 
    delta 0 'b' = 2 
    delta 1 'b' = 2 
    delta 2 'b' = 2 

toDA :: ListDA -> DA 
toDA (start, delta, final) = (start, deltaFun delta, (`elem` final)) 
    where deltaFun dl = curry (fromMaybe 0 . flip lookup dl) 

도다 기능의 목록 표시에 걸리는 기계적 및 기계적으로 변환한다. 이 기능과 나머지 라이브러리는 강의 의장이 제공합니다.

문제는 문자열을 읽고 유형

advance :: DA -> State -> String -> State 

이 기능은 자동 장치의 상태를 자동 장치, 상태 및 문자열을 받아 반환하는 함수를 작성하는 지금이다.

아이디어는 지금까지 분명합니다. DA 형의 오토 마톤에는 상태 전이 함수 델타가 있습니다. 그래서 함수 "advance"는 델타 함수를 어떤 식 으로든 호출해야합니다. 하지만 형식에 통합 된 함수에 어떻게 액세스 할 수 있습니까?

advance :: DA -> State -> String -> State 
advance (start, step, accept) fromState chars = .... 

type 키워드 그냥 type synonyms를 소개합니다 :

답변

4

당신은 그것을위한 패턴 매칭을 사용합니다. DA은 트리플 (Integer, Integer -> Char -> Integer, Integer -> Bool)의 동의어입니다.

귀하의 이름이 혼란 스럽습니다. deltaa 오토 마톤의 정의에서 상태 천이 함수이지만, toDA 함수의 정의에서는 delta이라는 매개 변수가 목록입니다. ListDA 유형은 또한 트리플 (상태, 전환 목록 및 허용 가능한 상태 목록 중 다른 하나)의 동의어이기도합니다.

advance (_, step, _) fromState chars = go fromState chars 
    where 
    go s []  = ... -- stop, and produce the state as the answer, 
         -- when the input string (list of chars) has ended 
    go s (c:cs) =   -- if not, then 
     let s2 = step s c -- make one step 
     in go .......  -- and loop with new values 

공지 사항 우리가 여기 start 또는 accept 변수에 대한 필요가 없습니다, 그래서 우리는이 익명 변수 패턴 _를 사용할 수 있습니다 여기에

이가 루프에 대한 재귀를 사용하여 코딩 할 수있는 방법입니다. 또한 stepState -> Char -> State 유형의 함수이며, 여기에 함수 호출에 사용 된 인수의 순서가 지정됩니다. 나는. 그것은 상태와 문자를 받아 들여 새로운 상태를 만든다.

하스켈을 전혀 모른다면, 좋은 튜토리얼 인 like this one을 읽고 이해하는 것이 도움이 될 것입니다.

마지막으로, 포럼에 질문을 올리는 것에 익숙하지 않다고 말씀 하셨으므로 accepting answersFAQ에 대한 일반적인 내용을 읽어 보시기 바랍니다.

+0

빠른 지원에 감사드립니다. 솔루션을 찾으려고했지만 성공하지 못했습니다. 나는 사전을 시도했다 :: DA -> 상태 -> 문자열 -> 상태 사전 (시작, 단계, 수락) 상태 문자 : Chars = 진행 (시작, 단계, 수락) (단계 상태 Char) Chars ' 읽히는 String의 요소를 순환하는 재귀 함수를 구현합니다. GHCi에로드하면 구문 분석 오류가 발생합니다. 그럼 내 실수는 어디 있니? – 0niveau

+0

@ user1838559 : 변수는 소문자로 시작해야하므로 'Chars'가 아닌'chars'를 사용하십시오. 또한,':'와 같은 연산자는 패턴에서도 함수 응용 프로그램보다 우선 순위가 낮으므로'(char : chars)'주위에 괄호를 써야합니다. – hammar

+0

@ 해머 : 그 해답을 가져 주셔서 감사합니다. 이런 어리석은 질문을하고이 철자 오류로 시간을 낭비하는 것에 사과드립니다. – 0niveau

3

함수는 실제로 전역 적으로 정의 된 함수와 패턴 매칭으로 얻은 함수 변수 사이에 차이가없는 지점에서 평가할 때까지 하스켈의 다른 유형의 데이터와 다르지 않습니다. 익명의 람다.윌 네스 말했듯이 경우

은, 그것은

advance (start, delta, terminate) = result 
당신은이 범위에서, delta을 사용할 수 있습니다 다음

및 기타 기능과 같은 terminate, 이름에 일치하는 패턴에 의해 기능을 얻는 가장 쉬운 방법 :

where result = delta start 'b' -- or whatever, conditional on terminate...