gpt4 book ai didi

haskell - Haskell 如何为类型类的实例选择方法?

转载 作者:行者123 更新时间:2023-12-04 10:25:52 25 4
gpt4 key购买 nike

我试图理解为什么 Haskell 的 show款待
与例如列表不同的字符列表整数
即使没有 FlexibleInstances语用。

阅读了 Show 的文档, 我意识到
我真的不明白 Haskell 是如何选择方法的
对于类型类的实例。

考虑以下代码:

class MyShow a where
myShow :: a -> String
myShowList :: [a] -> String
myShowTuple :: (a, b) -> String

myShowList xs = "Default List Implementation"
myShowTuple t = "Default Tuple Implementation"

instance MyShow Char where
myShow c = "One Char"
myShowList xs = "List of Chars"
myShowTuple t = "Char Tuple"

instance MyShow Int where
myShow n = "One Int"
myShowList xs = "List of Integers"
myShowTuple t = "Int Tuple"

instance MyShow Float where
myShow n = show n

instance (MyShow a) => MyShow [a] where
myShow = myShowList

instance (MyShow a) => MyShow (a, b) where
myShowTuple t = "foo"
myShow = myShowTuple

现在,如果我调用例如
myShow (5::Int,5::Int)

我希望 Haskell 认为
'哦, myShow有一个元组作为参数。让我们看看哪个
实现我必须打电话。
并选择最后一个作为返回的结果
"foo" .
显然,事实并非如此。
Haskell 好像是看元组的内容(即 a 的类型) 并决定调用相应的方法,
导致 "Int Tuple" .

为什么是这样?

最佳答案

当你写 myShow (5::Int, 5::Int) ,Haskell 确实说“哦,myShow 有一个元组作为参数。让我们看看我必须调用哪个实现。”它确实选择了最后一个,即 myShow = myShowTuple .但这并不意味着结果将是“foo”。表示调用myShow (5::Int, 5::Int)的结果将与调用 myShowTuple (5 :: Int, 5 :: Int) 的结果相同.

所以现在 Haskell 必须决定 myShowTuple 的版本。它必须打电话。由于myShowTuple有类型 MyShow a => (a, b) -> String , myShowTuple 的版本在倒数第二行定义的类型为 MyShow a => ((a, c), b) -> String ,所以一个不适合。第 17 行定义的类型为 (Int, b) -> String ,所以一个确实适合。所以这就是被选中的那个。

关于haskell - Haskell 如何为类型类的实例选择方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16885143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com