为什么`newtype` 不适用于这种模式匹配?

静俊

我通过将数据实现为Enum. 而且,我有一个问题只是替换Enumnewtype.

这是我的测试代码。

newtype Fruit = Fruit Int deriving (Eq)

apple = Fruit 0
banana = Fruit 1
grape = Fruit 2
orange = Fruit 3

instance Show Fruit where
  show apple = "Apple"
  show banana = "Banana"
  show grape = "Grape"
  show orange = "Orange"
  show _ = "Fruit"

test =
  map show [apple, banana, grape, orange, (Fruit 5)]

我预计评估test将是["Apple","Banana","Grape","Orange","Fruit"],但它是["Apple","Apple","Apple","Apple","Apple"]

我认为它变量可能不适用于模式匹配,但我又尝试了一次case,例如:

-- Fails: everything is "Apple"
instance Show Fruit where
  show g = case g of
    apple -> "Apple"
    banana -> "Banana"
    grape -> "Grape"
    orange -> "Orange"
    _ -> "Fruit"

为了确认我的临时文件,我再次尝试使用下一个代码。

-- Fails: Works only for apple/banana. Variable does not work!
instance Show Fruit where
  show (Fruit 0) = "Apple"
  show (Fruit 1) = "Banana"
  show grape = "Grape"
  show orange = "Orange"
  show _ = "Fruit"

我可以得到 ["Apple","Banana","Grape","Grape","Grape"]

好吧,我可以编写代码来实现Enum,但我只想了解为什么这些代码不起作用?

这段代码

instance Show Fruit where
  show apple = "Apple"
  show banana = "Banana"
  show grape = "Grape"
  show orange = "Orange"
  show _ = "Fruit"

相当于

instance Show Fruit where
  show x = "Apple"
  show y = "Banana"
  show z = "Grape"
  show w = "Orange"
  show _ = "Fruit"

因为它声明了命名的新变量apple, ...,这些变量会影响全局定义的变量,而与这些变量没有任何关系。

试试吧

instance Show Fruit where
  show x | x == apple = "Apple"
         | x == banana = "Banana"
         | x == grape = "Grape"
         | x == orange = "Orange"
         | otherwise = "Fruit"

要记住的经验法则是:在模式中,所有变量都是模式定义局部变量

我建议打开警告-Wall,因为这会指出局部变量对全局变量的影响。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个在类型上使用模式匹配的开关不适用于原始类型?

为什么Scala中的模式匹配不适用于变量?

为什么这种 curl 用法适用于 Windows 而不适用于 OSX / iOS?

为什么输入模式属性不适用于数字?

android与空间分裂不适用于这种情况。为什么?

为什么字符串concat宏不适用于这种“ +”情况?

为什么矢量的这种实现不适用于字符串?

为什么此模式不适用于敲除验证?(分隔的邮政编码)

为什么异步调用不适用于回调模式?

为什么以下模式不适用于所有操作系统版本?

为什么我的函数适用于矩阵但为什么不适用于向量?

为什么这种行为适用于javascript代码?

为什么Hibernate HSQL Concat不适用于MSSQL?

为什么@Autowired不适用于通用类型T?

为什么通用引用不适用于数组?

为什么constexpr不适用于构造函数?

为什么忽略SIGTRAP不适用于asm?

为什么Map在Groovy中不适用于GString?

为什么maxWidth属性不适用于EditText?

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

为什么下界不适用于向量对

为什么cout不适用于pthreads?

为什么php mongo $ in搜索不适用于ObjectId?

为什么Dijkstra的算法不适用于负负边缘?

为什么 a:hover 不适用于 bootstrap 源?

为什么 onclick 不适用于innerHtml

为什么窗口调整大小不适用于模态?

为什么TreeSet的remove()方法不适用于Integers?

为什么代码不适用于 Python 字典