2013-06-14 4 views
24

필자는 코드 사용시와 typeclass를 사용하지 않을 때 이해하기가 어렵습니다. 내 말은 이고, 은 이미 정의 된 타이타닉을 사용하지 않습니다. 예 (매우 어리석은 예), 나는 수행해야합니다타이 클립을 사용해야하나요?

data Cars = Brakes | Wheels | Engine 
data Computers = Processor | RAM | HardDrive 

class Repairable a where 
    is_reparaible :: a -> Bool 

instance Repairable Cars where 
    is_repairable (Brakes) = True 
    is_repairable (Wheels) = False 
    is_repairable (Engine) = False 

instance Repairable Computers where 
    is_repairable (Processor) = False 
    is_repairable (RAM)  = False 
    is_repairable (HardDrive) = True 

checkState :: (Reparaible a) => a -> ... 
checkState a = ... 

(물론, 이것이 바보, 불완전 예입니다).

하지만 약간의 사용을 위해 많이 필요합니까? 왜 나는 새로운 데이터 유형과 유형 (인스턴스가있는)을 정의하지 않고 간단하고 기능 만 정의하면 안된다.

이 예제는 너무 간단 합니다만 사실 함수를 정의하는 대신 github에서 하스켈 코드를 검색 할 때 사실 (새로운 데이터 유형 + 유형 + 인스턴스) 같은 것을 종종 봅니다.

그래서 새로운 데이터 유형, 유형 등을 만들고 언제 기능을 사용해야합니까?

감사합니다. 내가 (자신의 인스턴스) 새로운 데이터 유형 및 typeclasses을 정의하지 않고 기능을 간단하게 만 정의하는 일을하지 말아야하는 이유

답변

40

.

왜 실제로? 당신은 정의 할 수 있습니다 :

checkState :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b 
checkState is_repairable repairs destroy a 
    = if (is_repairable a) then repairs a else destroy a 

사람들은 항상 오용 유형 클래스입니다. 그것은 관용적이라는 의미는 아닙니다.

  • 는 하나가 다음과 같은 경우

    사용 유형 클래스 :

    이 더 일반적인 질문에 대답하기 위해, 여기 타입 클래스를 사용하는 경우 및 그 사용하지 엄지 손가락의 몇 가지 규칙이 있습니다 지정된 유형에 따라 올바른 행동

  • 유형 클래스가 관련있다 방정식 모든 인스턴스 만족해야 (즉, "법률")

당신은 단지 네임 스페이스 일하려고하는

  • : 6,

    는 경우 유형 클래스를 사용하지 마십시오. 그것이 모듈과 네임 스페이스가 필요한 것입니다.

  • 는 인스턴스의 소스 코드를 보지 않고 동작하는 방법을 추론 할 수없는 당신의 유형 클래스를 사용하는 사람은

  • 당신은 당신이 켜있는 확장이 통제 받고 있는지 찾을

+0

예! 이것은 아주 완전한 대답입니다, 대단히 감사합니다! 귀하의 "유형 수업을 사용하지 않을 경우 ..."는 특히 좋은 방법을 선택하는 데 도움이 될 것입니다. – vildric

+1

이것은 하나의 방법에 대해서만 형식 표식을 사용하지 마십시오. 비록 이것이 절대적인 엄격한 규칙은 아니지만 일반적인 힌트와 비슷합니다. – MathematicalOrchid

+2

@MathematicalOrchid 그건 하나의 메소드 만 가진 타입 클래스에 대한 법률을 거의 가지지 않기 때문에 "needs laws"규칙의 일부입니다 (연관 법칙이있는 'SemiGroup'과 같은 것을 제외하고) –

5

종종 유형 유형 대신 데이터 유형을 사용할 수 있습니다 (예 :물론

data Repairable a = Repairable 
    { getRepairable :: a 
    , isRepairable :: Bool 
    , canBeRepairedWith :: [Tool] -> Bool -- just to give an example of a function 
    } 

당신이 명시 적으로 값을 전달해야하지만 여러 선택 사항이있는 경우이 좋은 일을 할 수있다 (예를 들어, Sum의 생각과 숫자 가능한 Monoid들로 Product). 단 하나의 클래스에 대해 표현력이 다소 다르다는 것을 제외하고는.

+2

나는 downvoter가 아니지만. . . 이 답변은 실제로 IMHO 질문에 대답하지 않습니다. OP는 타이프 컬러가 언제 사용되어야 하는지를 묻습니다. 이 답변은 typeclasses에 대한 대안을 언급하고 있지만 대안을 언제 사용해야하는지에 대해서는 언급하지 않았습니다. (무엇이든간에, typeclass가 언제 이해 될 수 있는지에 대한 이해를 전제로하고 있으며, 많은 경우에 똑같은 대안을 제시합니다.) – ruakh

관련 문제