gpt4 book ai didi

haskell - 在运行时检查一个类型是否是 Haskell 中 Show 的实例?

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

假设我在 Haskell 中有一个简单的数据类型来存储一个值:

data V a = V a

无论 a 的类型如何,我都想让 V 成为 Show 的实例。如果 a 是 Show 的一个实例,那么 show (V a)应该返回 show a否则应返回错误消息。或者在 Pseudo-Haskell 中:
instance Show (V a) where
show (V a) = if a instanceof Show
then show a
else "Some Error."

这种行为如何在 Haskell 中实现?

最佳答案

正如我在评论中所说,分配在内存中的运行时对象在 Haskell 程序中没有类型标签。因此没有普遍的instanceof像 Java 这样的操作。

考虑以下内容的影响也很重要。在 Haskell 中,第一个近似值(即忽略一些初学者不应该过早处理的花哨的东西),所有运行时函数调用都是 单态 .即,编译器直接或间接地知道可执行程序中每个函数调用的单态(非泛型)类型。即使您的 V类型 show函数具有泛型类型:

-- Specialized to `V a`
show :: V a -> String -- generic; has variable `a`

...您实际上无法编写在运行时调用该函数的程序,而无需直接或间接地告诉编译器确切的类型 a将在每一次通话中。例如:
-- Here you tell it directly that `a := Int`
example1 = show (V (1 :: Int))

-- Here you're not saying which type `a` is, but this just "puts off"
-- the decision—for `example2` to be called, *something* in the call
-- graph will have to pick a monomorphic type for `a`.
example2 :: a -> String
example2 x = show (V x) ++ example1

从这个角度来看,希望你能发现你所问的问题:
instance Show (V a) where
show (V a) = if a instanceof Show
then show a
else "Some Error."

基本上,因为 a 的类型参数将在编译时知道任何实际调用您的 show函数,在运行时测试这种类型是没有意义的——你可以在编译时测试它!一旦你掌握了这一点,你就会被引导到 Will Sewell 的建议:
-- No call to `show (V x)` will compile unless `x` is of a `Show` type.
instance Show a => Show (V a) where ...

编辑:一个更有 build 性的答案可能是:你的 V type 需要是多个案例的标记联合。这确实需要使用 GADTs扩大:
{-# LANGUAGE GADTs #-}

-- This definition requires `GADTs`. It has two constructors:
data V a where
-- The `Showable` constructor can only be used with `Show` types.
Showable :: Show a => a -> V a
-- The `Unshowable` constructor can be used with any type.
Unshowable :: a -> V a

instance Show (V a) where
show (Showable a) = show a
show (Unshowable a) = "Some Error."

但这不是对类型是否为 Show 的运行时检查。实例—您的代码负责在编译时知道 Showable 的位置。构造函数将被使用。

关于haskell - 在运行时检查一个类型是否是 Haskell 中 Show 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785176/

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