gpt4 book ai didi

debugging - 是否可以在 Haskell 中将类型强制为类?

转载 作者:行者123 更新时间:2023-12-03 21:17:08 24 4
gpt4 key购买 nike

例如,假设我希望实现一个汇总 Num 列表的函数。 s。编码到一半,我想用 Debug.Trace 调试它:

module T where
import Debug.Trace

dosum :: (Num a) => [a] -> a
dosum xs = dosum' 0 xs
where
dosum' n [] = n
dosum' n (x:xs) = trace (show n) $ dosum' (n+x) xs

问题是这不会编译:
Could not deduce (Show a) arising from a use of dosum'
from the context (Num a)

我可以添加 (Show a)dosum然后在我完成调试时将其删除(在现实生活中,我希望有一个不一定在 Show 中的类型,但我将使用整数进行调试)。如果涉及一些功能,这可能会变得很麻烦,我会不断添加删除 Show a陈述。

我想要一个函数 unsafeShow
unsafeShow :: a -> String

如果 a 有效是 Show a如果不是,则可以自由崩溃。这可能吗?

最佳答案

不,这是不可能的。这将违反 parametricity ;不允许多态函数根据调用它的特定类型表现出不同的行为。它还会打破开放世界假设,即添加 Show类型的实例会改变程序的行为。

它可能是一个有用的调试辅助工具,因为某些东西被明确标记为不安全,但 GHC 不支持这样的功能,而且我认为它当前的实现不允许轻松添加一个。

一种可能的替代方法是,如果您有许多具有相同类型类上下文的函数,并且有一个概念语义分组,则可以使用类似的类

class (Num a) => Number a
instance (Num a) => Number a

您可以使用它来代替 Num在签名中,将声明更改为 (Num a, Show a)调试时。 (不过,最好选择一个比 Number 更有意义的名称!)

关于debugging - 是否可以在 Haskell 中将类型强制为类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211664/

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