我有一个返回产品价格的功能,目前看起来像
priceOfProduct:: Int -> Int -> Int
值得宣布
type Price = Int
使功能变为
priceOfProduct :: Int -> Int -> Price ?
我想这样做,然后继续使用Ints元组,如果它们是他们自己的数据结构,它们可能看起来更好。
priceVsTaxed -> Price -> Int -> (Price, Price)
这有用吗?这有必要吗?
这是一个很好的Haskell风格吗?
声明一个看起来更像是重命名现有数据结构好样式的数据结构吗?
答案 0 :(得分:11)
并不总是值得定义额外的类型,但绝对避免Int -> ... -> Int
签名。这些使得很难理解如何使用函数。
所以实际上我说你不仅应该重命名结果,还要重命名参数。然后,如果有人想要使用你的函数,他们可以让编译器解释参数:
foo :: Price
foo = priceOfProduct _ _ + priceOfProduct _ _
将给出编译器(GHC> = 7.10)消息,如
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 _ _
但是你应该考虑一下你是否想要使类型区分变得更加严格:一个简单的type
def永远不会让你把参数置于错误的顺序,所以也许你可能会这样做更好地做到这一点
newtype Price = Price {priceInEuroCents :: Int}
这也避免了价格给出的货币/数量的模糊性。