gpt4 book ai didi

haskell - 解析存在类型的函数调用

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

阅读后this page关于 Haskell 中的存在主义,我不得不测试这种行为的局限性,所以我编写了以下代码片段:

{-# LANGUAGE ExistentialQuantification #-}

data Showable = forall a. Show a => MkShowable a

pack :: Show a => a -> Showable
pack = MkShowable

instance Show Showable where
show (MkShowable x) = show x
Showable类型与 ShowBox 非常相似在上述链接中创建的类型。然后我创建了这个人为的例子来说明我的问题。
showSomething :: Bool -> Showable
showSomething True = pack 1
showSomething False = pack "ABC"

main :: IO ()
main = do
x <- getLine
let y = read x
print $ showSomething y

此代码(工作正常)要求用户输入(应该是“真”或“假”),然后打印出 1如果为 True 或 "ABC"如果它是假的。

但我无法完全理解系统是如何做到这一点的。从数学上讲,这是完全合理的。但是我看不到计算机如何解决它。在我看来,系统似乎在运行时决定是否调用 Intshow实例或 Stringshow函数,但这意味着存在像 C++ 的 vtables 这样的东西,我不相信 Haskell 有这个概念。

我的问题是:它如何解决这个问题?系统无法提前知道我要输入真假,所以不知道是哪个 show在编译时调用,但它显然适用于两种情况。

最佳答案

实现类型类的一种方法是传递一个在底层实现类型类的函数字典。例如带有签名的函数

f :: Show a => T

会被翻译成
f' :: (a -> String) -> T

由编译器和任何时候 showf 内使用,它被附加参数取代(实际上会有更多函数,所有函数都在 Show 中声明)。

同样的数据类型
forall a . Show a => MkShowable a

会被翻译成
forall a . MkShowable' (a -> String) a

所以转换后的代码可能如下所示:
{-# LANGUAGE ExistentialQuantification #-}

data Showable' = forall a . MkShowable' (a -> String) a

pack' :: Show a => a -> Showable'
pack' = MkShowable' show

instance Show Showable' where
show (MkShowable' f x) = f x

showSomething :: Bool -> Showable'
showSomething True = pack' 1
showSomething False = pack' "ABC"

pack被称为 show实现也传递给构造函数,以便在需要时可用。

关于haskell - 解析存在类型的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27456680/

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