2017-11-17 21 views
7

나는 제품의 가격을 반환하는 함수, 그것은 현재 보이는 한 함수가 생각"name"= Int - 선언 할만한 가치가 있습니까?</p> <pre><code>priceOfProduct:: Int -> Int -> Int </code></pre> <p>이 선언의 가치를처럼

priceOfProduct :: Int -> Int -> Price ? 

된다 그래서

type Price = Int 

이 작업을 수행 할 때, 필자는 Ints의 튜플을 사용하기로했으며,이 튜플은 자체 데이터 구조 일 경우 더 잘 어울릴 것입니다.

priceVsTaxed -> Price -> Int -> (Price, Price) 

이 정보가 유용할까요? 필요한가?

하스켈 스타일입니까?

기존 데이터 구조 좋은 스타일의 이름을 바꾸는 것처럼 보이는 데이터 구조를 선언하고 있습니까?

+1

함수의 이름이 이미 가격을 의미하기 때문에'Int -> Int -> Price'는 도움이되지 않습니다. 'Type Quantity = Int'와'UnitPrice = Int'는 훨씬 더 유용한'priceOfProduct :: Quantity -> UnitPrice -> Price'를 허용합니다. – chepner

+0

또한 마지막에 맞는지 확실하지 않은 경우에도 유형을 쉽게 변경할 수 있습니다. –

답변

11

추가 유형을 정의 할 필요는 없지만 Int -> ... -> Int 서명을 확실히 피하십시오. 이것들은 함수의 사용 방법을 이해하는 것을 매우 어렵게 만듭니다.

사실 나는 결과가 아니라 특히 인수도 바꿔야한다고 말하고 싶습니다. 누군가가 당신의 기능을 사용하고자하는 경우, 그들은 단지 컴파일러가 인수를 설명하도록 할 수 있습니다 : 당신은 그러나 고려해야

Foo.hs:Y:X: error: 
    • Found hole: _ :: PriceOfProductFirstArgument 
    • In the first argument of ‘priceOfProduct’, namely ‘_’ 
     In the expression: priceOfProduct _ _ 
     In an equation for ‘foo’: main = foo = priceOfProduct _ _ + priceOfProduct _ _ 

같은

foo :: Price 
foo = priceOfProduct _ _ + priceOfProduct _ _ 

이 컴파일러를 줄 것이다 (GHC는> = 7.10) 메시지 이 유형의 구분이 더 엄격한 만들고 싶어하지 않는 경우 : 간단한 type 데프는 잘못된 순서로 인수를 퍼팅에서 당신을 저장할 수 없다, 그래서 아마 당신은 더 좋게 만드는 것 그것은

newtype Price = Price {priceInEuroCents :: Int} 

또한 가격이 제공되는 통화/수량에 대한 모호성을 피할 수 있습니다.

+1

최근의'newtype' :'newtype Price u = price {getPrice :: Int}'에'data Euro','data USDollar'를 조금 더 추가하면 다른 통화로'Price' 함수를 재사용 할 수 있습니다. – Zeta

+1

@Zeta 이는 실제 금융 거래에서 옳은 일일 것입니다. 왜냐하면 통화 교환은 동형 이성향이 아니기 때문입니다. 그러나 일반적으로 수량과 함께이 접근법을 좋아하지 않습니다. 이러한 데이터 유형은 구체적인 단위 시스템에 대한 참조없이 해당 수량의 일반 물리적 개념에 대해 IMO가 추상화해야합니다. – leftaroundabout