이름이 같은 데이터 생성자가 다른 유형 생성자에서 허용되지 않는 이유는 무엇입니까?


11

다음 선언은 오류를 제공합니다.

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

답변:


13

데이터 생성자는 함수일 뿐이므로 Haskell에서는 함수 오버로드가 허용되지 않기 때문입니다. GADT 구문을 사용하여 유형을 정의하면 더 명확 할 수 있습니다.

{-# LANGUAGE GADTs #-}
data Obj2d where
    Rect :: Float -> Float -> Obj2d   -- a function from floats to obj2d's
    Translate :: Vec2d -> Obj2d       -- a function from vec2d's to Obj2d's

나는 그들 (GHC 개발자)이 type class동일한 데이터 생성자를 공유하거나 모든 유사한 유형 의 새로운 유형을 도입하는 것을 포함 하여이 문제에 대한 가능한 해결책을 찾고 있다고 생각합니다. 계속 지켜봐주십시오. 문제에 대한 해결책이 곧 올 것입니다! (나는 희망)


나는 분명히 type class당신이 규정하고있는 이러한 구조를 기대 하고 있습니다. - 그 이유는 : 나는 내가 할 수있는, 문제가없는 Translate2Translate3d,하지만 난 오히려 네임 스페이스를 오염시키지 것입니다.
Sz

나는 GHC 개발자가 아니기 때문에 들려주는 것입니다. 나도 그런 일이 있기를 바랍니다.
bstamour
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.