输入“name”= Int - 值得声明吗?

时间:2017-11-17 12:43:41

标签: haskell data-structures declaration

我有一个返回产品价格的功能,目前看起来像

priceOfProduct:: Int -> Int -> Int

值得宣布

type Price = Int

使功能变为

priceOfProduct :: Int -> Int -> Price ?

我想这样做,然后继续使用Ints元组,如果它们是他们自己的数据结构,它们可能看起来更好。

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

这有用吗?这有必要吗?

这是一个很好的Haskell风格吗?

声明一个看起来更像是重命名现有数据结构好样式的数据结构吗?

1 个答案:

答案 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}

这也避免了价格给出的货币/数量的模糊性。