【问题标题】:Haskell Couldn't match expected type `Integer' with actual type `[Integer]'Haskell 无法将预期类型“整数”与实际类型“[整数]”匹配
【发布时间】:2013-11-27 16:23:50
【问题描述】:

这是我的代码,我怎么能说 n 在 2..10 之间是 int 的位置

   data Rank = Numeric Integer | Jack | Queen | King | Ace
        deriving (Eq, Show)

valueRank :: Rank ->Integer
valueRank rank

|rank ==Jack = 10
|rank ==King = 10
|rank ==Queen = 10
|rank ==Ace = 10
|rank == Numeric n = n
  where n =[x|x<-[2..10]]

【问题讨论】:

  • [x | x &lt;- [2..10]] 返回一个列表,因此在最后一行中,n 的类型为 [Integer]。您不能在类型级别上真正限制 n 的范围。您可能只想在它被添加到 Numeric 之前检查它

标签: haskell


【解决方案1】:

我建议你使用模式匹配而不是守卫:

valueRank :: Rank -> Integer
valueRank Jack = 10
valueRank King = 10
valueRank Queen = 10
valueRank Ace = 10
valueRank (Numeric n) = n

如果您想确保不能使用超出特定范围的值创建数字,那么在进行排名时,您应该使用验证此属性的smart constructor

makeRank n
  | 1 <= n <= 13 = ...
  | otherwise = error ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多