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


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당신이 규정하고있는 이러한 구조를 기대 하고 있습니다. - 그 이유는 : 나는 내가 할 수있는, 문제가없는 Translate2및 Translate3d,하지만 난 오히려 네임 스페이스를 오염시키지 것입니다.
— Sz

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