2017-01-25 12 views
0

누군가 설명해 주실 수 있습니까? "g 설명"? 어떻게 f1 단위를 가져올 수 있으며 int를 반환 & 나머지 너무 혼란 스러워요 !!패턴 매칭 SML?

(* Description of g: 
* g takes f1: unit -> int, f2: string -> int and p: pattern, and returns 
* an int. f1 and f2 are used to specify what number to be returned for 
* each Wildcard and Variable in p respectively. The return value is the 
* sum of all those numbers for all the patterns wrapped in p. 
*) 

datatype pattern = Wildcard 
       | Variable of string 
       | UnitP 
       | ConstP of int 
       | TupleP of pattern list 
       | ConstructorP of string * pattern 

datatype valu = Const of int 
       | Unit 
       | Tuple of valu list 
       | Constructor of string * valu 


fun g f1 f2 p = 
    let 
     val r = g f1 f2 
    in 
     case p of 
      Wildcard   => f1() 
     | Variable x   => f2 x 
     | TupleP ps   => List.foldl (fn (p,i) => (r p) + i) 0 ps 
     | ConstructorP (_,p) => r p 
     | _     => 0 
    end 

와일드 카드 모든 것을 일치와 바인딩의 빈 목록을 생성합니다.

변수 s은 임의의 값 v와 일치하고 (s, v)를 보유하는 하나의 요소 목록을 생성합니다.

UnitP Unit 만 일치하고 빈 바인딩 목록이 생성됩니다.

ConstP 17은 Const 17 만 일치하고 빈 바인딩 목록을 생성합니다 (다른 정수에서도 마찬가지 임).

TupleP ps은 ps와 vs의 길이가 동일하고 모든 i에 대해 ps의 i 번째 요소가 vs의 i 번째 요소와 일치 함을 나타냅니다. 생성 된 바인딩 목록 중첩 된 패턴 일치의 모든 목록이 함께 추가됩니다.

ConstructorP (S1, P) 일치 생성자 S1과 S2가 같은 문자열이있는 경우 (S2, V) (당신이 =과 비교 가능), p는 V와 일치합니다. 생산 바인딩의 목록은에서 목록입니다 중첩 패턴 일치. 문자열 s1과 s2를 생성자 이름이라고합니다.

다른 일치하는 항목이 없습니다.

답변

2

누군가 설명해 주실 수 있습니까? "g 설명" 어떻게 f1 단위를 가져올 수 있으며 int를 반환 & 나머지 너무 혼란 스러워요 !! 이 두 가지 기능을 하나에 있는 세 가지 (카레) 매개 변수를 사용하므로

  • 함수 g(단위 → INT) → (문자열 → INT) → 패턴 → INT 입력 갖는다 패턴.

  • 파라미터 f1f2 및 외부 소스에 의해 결정된 각각 임의의 정수/스트링을 반환 할 수 부작용과 항상 같은 결정 상수를 반환하는 함수, 또는 함수를 여야. 코멘트는 "각 와일드 카드에 대해 반환 할 것을 수 및 변수"말하고 있기 때문에

    , 그것은 f1가 서로 다른 시간에 서로 다른 번호를 반환해야 가능성이 높습니다 소리 (내가 수가 참조 무엇 확실하지 않다 f2의 경우!). 하나의 정의는 다음과 같을 수 있습니다.

    local 
        val counter = ref 0 
    in 
        fun uniqueInt() = !counter before counter := !counter + 1 
        fun uniqueString() = "s"^Int.toString (uniqueInt()) 
    end 
    

    이것은 단지 추측입니다. 이 정의는 Int.maxInt까지만 작동합니다.

  • 은 코멘트

    g 등의 반환 값을 설명 [...] P 래핑 모든 패턴 모든 숫자의 합. 숫자가 어떤 의미를 귀속되지 않으므로 g가 주어지지 않는 임의의 테스트에 대해 f1f2의 임의의 주어진 세트의 출력을 비교하는 있지만 실용적인 목적을 제공 같은

    , 그것이 보이지 않는다.

  • 캐치 - 모든 패턴은 종종 나쁜 : 다른

    ... 
    | _ => 0 
    

    아무것도 일치하지 않습니다.

    이유는 패턴의 부가적인 유형의 패턴을 연장하는 경우, 컴파일러 기능 g에서 누락 패턴을 통지하지 않을 것이다; catch-all은 아마도 아직 정의되지 않은 경우에 대해 의미를 암시합니다.

+0

위대한 답변! 감사 :) –