호환되지 않는 데이터 유형을 여러 개 만들고 싶습니다. 즉, 나는 파라미터 화 된 형태 Foo a
이, 그리고 실제로 a
가 무엇인지에 대해을 돌보는이없는 기능 같은하스켈에서 싱글 톤 유형을 올바르게 생각하고 사용하고 있습니까?
bar :: (Foo a) -> (Foo a) -> (Foo a)
것입니다. 대한 Int
및 Char
(나는 단지 그들이 동일하지 않은 것을 신경)을 동시에 정말 상관 없어 동안 더 명확히하기 위해, 나는
x :: Foo Int
y :: Foo Char
bar x y
일에서 저를 중지 타입 시스템을 싶습니다 .
내 실제 코드에는 주어진 반지를 통해 다항식 형식이 있습니다. 타입 시스템이 s의 다항식을 사용하여 t의 다항식을 더할 수없는 한, 나는 불확정성이 무엇인지 상관하지 않습니다. 내가 치료를 할 때문에 주어진 다항식이 끝난 특정하는 링에 대해 지금까지 내가 typeclass Indeterminate
을 만들고,
data (Ring a, Indeterminate b) => Polynomial a b
이 방식으로 내 다항식 유형을 매개 변수화하여이 문제를 해결했습니다는 Ring
부분을 완벽하게 자연의 느낌 . 아래에 설명 된대로 Indeterminate
부분에 대해서는 매우 고심했습니다.
위의 접근 방식은 정상적으로 작동하지만 인위적으로 느껴집니다. 특히이 부분은 다음과 같습니다.
class Indeterminate a where
indeterminate :: a
data T = T
instance Indeterminate T where
indeterminate = T
data S = S
instance Indeterminate S where
indeterminate = S
(기타 등등) 이상하고 잘못 느껴집니다. 본질적으로 Indeterminate
의 인스턴스가 싱글 톤이되도록 요청하려고합니다 (this sense). 이상하게 느껴질 수있는 하나의 지표입니다. 또 다른 사실은 실제 b
이 종종 유추 될 수 없기 때문에 (실제로 이상하지는 않지만 짜증나지만) 내 Polynomial a b
에 많은 주석을 달아야한다는 것입니다.
제안 사항? 나는 이것을 계속해야 할까? 아니면 내가 놓친 것일까?
추신 : 나는 즉시 응답을 upvote하지 않거나 수락하지 않으면 기분을 상하게하지 마십시오. 나는 며칠 동안 다시 체크인 할 수 없을 것이다. 모든
다항식을 반지의 요소 시퀀스 또는 비슷한 것으로 모델링하지 않는 좋은 이유가 있습니까? 예를 들어 부분합 시퀀스? –
자, 여기 조금 잃어 버렸어. 나는 왜 당신이'불확정 '을 필요로하는지 이해하지 못한다. 두 개의 b가 동일하다는 것을 강요하고 싶다면 형식 서명에 그대로 두십시오. – sclv
@ Alexandre C .: 나는 그렇게하고있다. 그러나 타입 시그니처를 "6 +"에 "2 + 5t"를 추가하는 것이 의미없는 것으로 만들고 싶습니다. 반지 요소의 시퀀스로서 다항식을 사용할 때, 타입 시스템 (정당하게)은 다른 링에 계수가있는 반지름의 계수가있는 다항식을 추가하지 못하도록합니다. 그러나 불확정성을 구별하지는 않습니다. 이제, 내가 정말로 불확정성을 필요로하는지 여부는 매우 유효한 질문입니다 :-) – gspr