왜 이것들이 동일하지 않습니까?
show $ if someCondition then someInt else some double
과
if someCondition then show someInt else show someDouble
if ... else
첫 번째 예제 의 부분을 표현식으로 분리하면 익명 합계 유형으로 유형을 나타낼 수 없다는 Int | Double
것을 이해합니다. langauge는 자주 사용하고 Sum 유형을 지원합니다.) Either
를 기반으로 데이터를 사용해야합니다 show
.
여기에 제시 한 예는 사소한 것이지만 "알겠습니다. 뭔가 보여줄 것입니다. 뭔가 someCondition
가"어떤 조건이 참이면 someInt가 그렇지 않으면 someDouble을 표시합니다 "보다는" 코드 중복을 줄이려면 (여기에서 쇼는 두 번 반복되지만 긴 기능 응용 프로그램 if ... else
이 될 수 있으며 고려해야 할 분기가 2 개 이상일 수 있습니다)
내 마음에 컴파일러가 합계 유형 (여기 Int | Double
) 을 만드는 각 유형 을 show
기능 매개 변수로 사용할 수 있는지 확인하고 유형이 올바른지 여부를 결정하는 것이 쉬워야합니다 . 더 좋은 점은 show
함수 string
가 매개 변수 유형에 관계없이 항상 반환 하므로 컴파일러는 가능한 모든 "분기"(모든 가능한 유형)를 가지고 다닐 필요가 없습니다.
그러한 기능이 존재하지 않는 것이 선택입니까? 아니면 내가 생각하기가 더 어려워지고 있습니까?
making all conversions explicit
. 내 질문에, 나는 Haskell Int
이 Double
또는 그 반대로 캐스팅하는 것을 원하지 않습니다 . 방금 두 가지 유형을 예로 사용했습니다. 당신은 모든 대체 할 수 Int
와 a
와 Double
함께 b
두 가지 유형이 파생 내 문제 Show
. 나는 anonymous sum types
Haskell 에 없다는 것을 이해 하지만 그것이 왜 그런지, 그리고 언어를 디자인하는 데 방해가되는 이유를 알고 싶습니다.
x :: Int | Bool
우리가 컴파일해야 한다면 , 타입 삭제 기반 RTS에서 show x
호출에 사용할 함수 포인터를 알 수있는 쉬운 방법은 없습니다 show
. 우리는 아마도 런타임에 몇 가지 유형 수준 정보를 유지해야 할 것입니다.
(String, Int)
익명이 아닙니다. 재미있는 구문을 가진 일반 제품 유형입니다. (String | Int)
완전히 다른 것입니다. 자신 (Int|Int)
과 동일해야하는 Int
이유와 이유 를 묻는 것으로 시작하십시오 .
if ... then ... else ...
의에서 동일한 유형이 있어야then
하고else
일부를. 일부 프로그래밍 언어에서는 삼항 연산자로 볼 수 있습니다.