F #의 거듭 제곱 연산자가 부동 소수점 숫자에만 작동하는 이유는 무엇입니까?
나는 언어에 지수 또는 지수 연산자가 부동 소수점 숫자 만 취하는 것을 본 적이 없습니까?
예를 들면 :
2 ** 2
오류를 던진다 The type 'int' does not support any operators named 'Pow'
이 설계 결정에 대한 타당한 이유가 있습니까?
(**)
그리고 pown
다른 두 가지입니다. 를 보면 (**)
로그를 사용하는 수학 공식을 생각할 수 있습니다. 를 보면 pown
일련의 곱셈 일뿐입니다. 대부분의 다른 언어는 그러한 차이를 만들지 않기 때문에 처음에는 놀랍거나 혼란 스러울 수 있음을 이해합니다 (주로 정수는 종종 암시 적으로 부동 소수점 값으로 변환되기 때문입니다). 수학에서도 약간의 차이가 있습니다. Wikipedia 항목을 참조하세요 . 첫 번째 정의는 양의 정수 지수에 대해서만 작동합니다.
서로 다른 (하지만 관련이있는) 사물이므로 서명이 다릅니다. 여기 있습니다 (**)
:
^a -> ( ^b -> ^a) when ^a : (static member Pow : ^a * ^b -> ^a)
그리고 여기 있습니다 pown
:
^a -> (int -> ^a)
when ^a : (static member get_One : -> ^a) and
^a : (static member ( * ) : ^a * ^a -> ^a) and
^a : (static member ( / ) : ^a * ^a -> ^a)
당신이 당신의 자신의 유형을 작성하는 경우, 당신은 당신이 필요합니다 One
, (*)
그리고 (/)
이 작업을 얻을 pown
. 라이브러리는 루프를 수행합니다 (최적화되었으며 순진한 O (n)이 아닙니다).
(**)
정수가 아닌 값에 대해 유형에 연산자 를 사용하려면 전체 논리를 작성해야합니다 (에서와 동일한 알고리즘이 pown
아님).
두 개념을 분리 한 것이 좋은 디자인 결정이라고 생각합니다.
적분 거듭 제곱의 경우 F #은 또 다른 연산자 pown
. 또한, 사이드 참고로 모두 (**)
와는 pown
적절 부재 (정적를 제공하는 다른 타입들과 함께 사용하기 위해 완벽하게 가능하므로, 오버로드 Pow
의 경우에있어서 (**)
, (*)
그리고 (/)
오퍼레이터 및 정적 One
의 경우 속성 pown
).
F # 팀이에서 Pow
멤버 를 시뮬레이션하지 않기로 선택한 이유는 말할 수 없지만 연산자를 대신 사용할 수 int
있었기 때문에 긴급하다고 생각하지 않았을 것입니다 pown
(그리고 아마도 먼저 float로 변환하는 것이 더 합리적 일 것입니다. 큰 피연산자의 경우).
짧은 대답은 정수 유형, 심지어 int64에도 유용하지 않기 때문입니다. 2 ^ 26은 ~ 1.84467441E19 만 제공합니다. 따라서 두 개의 값 X와 Y가 모두 19보다 큰 경우 거듭 제곱 연산자가 오버플로를 발생시킵니다.
나는 그것이 작은 값에 유용하다는 데 동의하지만 일반적으로 정수 유형에는 유용하지 않습니다.
F #의 기반 언어는 연산자 오버로딩이나 자동 데이터 강제 변환을 수행하지 않는 OCaml입니다 (명시 적 강제 변환을 선호 함).
따라서 double을 추가하는 경우에도 다른 연산자 (+.)가 필요합니다. 이것이 F #이 그것에 대한 엄격함을 얻는 곳인지 확실하지 않지만 그것이 있다고 생각합니다.
Python 또는 Scheme과 같은 동적 언어에서는 숫자가 너무 크면 더 큰 데이터 저장소로 자동 데이터 강제 변환을 받게됩니다. 예를 들어 결과에 대해 큰 정수를 제공하는 정수 지수가있는 정수를 가질 수 있습니다.
OCaml 및 F #은 극도의 유형 안전 정신을 가지고 있습니다.
'programing tip' 카테고리의 다른 글
GetHashCode를 올바르게 구현 (0) | 2020.12.26 |
---|---|
Scala.React의 상태는 어떻습니까? (0) | 2020.12.26 |
대부분의 UI 프레임 워크가 단일 스레드 인 이유는 무엇입니까? (0) | 2020.12.26 |
OCaml 프로젝트를 구성하고 빌드하는 데 선호되는 방법은 무엇입니까? (0) | 2020.12.26 |
Quartz.NET 구성 파일에 대한 문서는 어디에 있습니까? (0) | 2020.12.26 |