>source

함수가 포함된 Set 모듈을 만들고 싶습니다. 그러나 Set이 필요로 하는 기능을 비교할 방법은 없는 것 같습니다. 이 명백한 것은 컴파일됩니다.

module Action= struct
  type t= unit -> unit
  let compare : t -> t -> int= Stdlib.compare
end
module Actions= Set.Make(Action)

하지만 사용하려고 하면:

치명적인 오류: 예외 Invalid_argument("compare: 기능 값")

나는 기능이 동일한 객체인지 비교하고 싶습니다. 동일한 동작을 위해 비교하는 것과 같은 어리석은 일을 하려는 것이 아닙니다.

여기에서 Obj 모듈의 무언가를 사용해야 합니까?

그냥 궁금해서 주문한 집합을 구현하려고 합니까?

Nalin Ranjan2022-02-15 06:24:46
  • 답변 # 1

    오캠 표준 라이브러리 비교하다문서 상태 ...

    val 비교 : 'a -> 'a -> 정수

    x y 비교x가 y와 같으면 0, x가 y보다 작으면 음의 정수, x가 y보다 크면 양의 정수를 반환합니다. 에 의해 구현된 주문비교하다비교 술어와 호환 가능=,<그리고>부동 소수점 값 nan처리에 대한 한 가지 차이점과 함께 위에서 정의했습니다. 즉, 비교 술어는 nan을 자신을 포함한 다른 float 값과 다른 것으로 취급합니다. 동안비교하다nan은 자신과 동일하고 다른 부동 소수점 값보다 작은 것으로 취급합니다. nan처리는 비교가 전체 순서 관계를 정의하도록 합니다.

    비교기능 값에 적용하면 Invalid_argument가 발생할 수 있습니다.비교하다순환 구조에 적용하면 종료되지 않을 수 있습니다.

    비교하다함수에서 요구하는 비교 함수로 사용할 수 있습니다.설정.메이크그리고맵메이크펑터 뿐만 아니라목록.정렬그리고배열.정렬기능.

    이제 OCaml에는 두 가지 평등 개념이 있습니다. 즉...

    1. 구조적 평등: 연산자를 사용하여 표현=, 그 유형은

    # (=);;
    -: 'a -> 'a -> bool= <fun>

    1. 물리적 평등: 연산자를 사용하여 표현==, 그 유형은

    # (==);;
    -: 'a -> 'a -> bool= <fun>

    보다시피 둘 다 유형은 동일하지만기능 응용둘의 경우는 다르다.함수 값인수로.

    구조적 평등함수 값을 유지하지 않지만물리적 평등할 수 있습니다.비교하려고(에서와 같이=) 와 함께함수 값던진다. 그리고 의 문서에 명시된 바와 같이Stdlib.compare, 그것은 사용구조적 평등.


    그림: 기능 값과 구조적 평등

    # let f x= x;;
    val f : 'a -> 'a= <fun># let g x= x;;
    val g : 'a -> 'a= <fun># f= g;;
    Exception: Invalid_argument "compare: functional value".
    # g= f;;
    Exception: Invalid_argument "compare: functional value".
    


    그림: 기능 값과 물리적 동등성

    # let f x= x;;
    val f : 'a -> 'a= <fun># let g x= x;;
    val g : 'a -> 'a= <fun># f== g;;
    -: bool= false
    # f== f;;
    -: bool= true
    # g== g;;
    -: bool= true
    # g== f;;
    -: bool= false
    # let h x y= x + y;;
    val h : int -> int -> int= <fun># h== f;;
    Error: This expression has type int -> int
           but an expression was expected of type int -> int -> int
           Type int is not compatible with type int -> int
    

    간단히 말하면Stdlib.compare~와 함께설정.메이크~와 함께함수 값.

    그래서...

    1. 또는 우리는유형 t~에동작모듈구조적 평등계속 사용해야 하는 경우 적용할 수 있습니다.Stdlib.compare.
    2. 또는 구현비교하다그것으로 뭔가를 할 수 있도록함수 값의 기능 계약을 충족하는 것과 함께 인수로val 비교 : t -> t -> 정수에 의해 위임 Set.OrderedType모듈 유형.


    WYSIWYG=> 보여주는 것과 얻는 것

  • 답변 # 2

    작업에 ID를 추가합니다. 예를 들어 이름으로 작업을 비교할 수 있습니다.

    module Action= struct
      type t= {
        name : string;
        func : (unit -> unit);
      }
      let compare x y= String.compare x.name y.name
     end
    

    또한 예를 들어 생성된 모든 작업을 기록하는 전역 해시 테이블을 도입하여 모든 작업의 ​​이름이 서로 다른지 확인해야 합니다. 작업이 다음을 통해서만 생성 가능한지 확인하십시오.동작적절한 서명을 추가하여 모듈.

  • 답변 # 3

    의미론Stdlib.compare하위 부분이 어떻게 비교되는지 보기 위해 개체 내부를 임의로 깊숙이 살펴보는 것입니다. 당신이 지적한 것처럼 이것은 실제로 기능에 대해 작동하지 않습니다. 따라서 OCaml은 허용하지 않습니다.비교하다기능에 적용됩니다.

    물리적 동등성을 사용하려는 경우에도 함수에 적용할 수 있는 유용한 순서는 없습니다. 함수 값은 변경할 수 없으며 적어도 이론상으로는 런타임 시스템에 의해 물리적으로 복제되거나 이동할 수 있습니다.

    순서는 필연적으로 임의적이기 때문에 임의의 순서를 만들어 동일한 효과를 얻을 수 있습니다. 새 쌍을 만들 때 단조롭게 증가하는 int 값과 함수를 쌍으로 구성하십시오.

  • 이전 사육사 문제 -리더가 사망한 경우 복구하는 데 15분 소요
  • 다음 flutter : 플러터에 컨테이너를 사용하여 아래 이미지와 같이 곡선/오목을 만드시겠습니까?