다음 선언은 오류를 제공합니다.
type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
| Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
| Translate Vec3d Obj3d
즉 Multiple declarations of 'Translate'.
이제이 제한이 도입 된 이유가 궁금합니다.
제한이 없으면 다음과 같이 쓸 수 있습니다.
Translate (1, 1) Rect 2 2
그리고
Translate (1, 2, 3) Cuboid 1 1 1자연스럽게 들립니다.
나는 (즉시)이 같은 이름을 사용하여 허용하는 구문 분석 문제 입찰을 초래할 수 표시되지 않습니다, 유형은 (인수로 유추 할 수 Rect 2 2있는 Obj2d, Cuboid 1 1 1입니다 Obj3d).
언어 디자이너가 다른 유형의 데이터 생성자에 동일한 이름을 사용하지 않기로 선택한 좋은 이유가 있다고 확신하지만 분명히 필요하지 않은 이유는 무엇입니까?
(그리고 유형 명확성은 Haskell의 빵과 버터 사업입니다!)
3
인수에 의해 유추되는 유형과 관련하여 : 때로는 인수 의 유형이 함수 의 유형에서 유추 된다는 것을 알고 있습니까?
@delnan 나는 그것을 몰랐습니다 ... 나에게 대답처럼 들립니다. 결정 요소로 설명 할 때 타입 그래프의 다른 쪽에서 타입 정보를 사용하여 모호한 해상도를 볼 수는 있지만 항상 추론이 상향되었다고 생각했습니다 ... 이에 대한 내 정신 이미지는 그래프와 함수 호출은 상단에서 분해됩니다. 해상도는 하단에서 접어서 형성되는 집계입니다. 그러나 그것은 전체 그림이 아닙니다 . 완벽한 추론을 가진 의존적으로 타이핑 된 언어에서 이것은 아마도 더 정확할 것이다.
—
Jimmy Hoffa