gpt4 book ai didi

reflection - Haskell:为什么要进行类型检查?

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

这是从 Reflection-0.5 中提取的一个最小示例。

{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
{-# OPTIONS_GHC -fno-cse -fno-full-laziness -fno-float-in #-}

import Control.Applicative
import Data.Proxy

newtype Zero = Zero Zero deriving (Show)

class ReifiesNum s where
reflectNum :: Num a => proxy s -> a

instance ReifiesNum Zero where
reflectNum = pure 0

在 GHCi 中,我得到以下信息:
>:t Zero
Zero :: Zero -> Zero

这是有道理的:我要的是构造函数的类型,它接受一个零并返回一个零。
>:t reflectNum
reflectNum :: (ReifiesNum s, Num a) => proxy s -> a

我可以写类似的东西是有道理的
>let x = Just (undefined::Zero)
>reflectNum x

因为 Just Zero 类型与类型变量“proxy s”匹配。

最后,令人困惑的部分:
>:t (reflectNum Zero)
(reflectNum Zero) :: Num a => a

我不明白构造函数 Zero::Zero -> Zero 的类型如何显然与类型变量“proxy s”匹配,但显然它确实如此,因为 (reflectNum Zero) 的类型只是“a”。

我将不胜感激帮助理解此示例,并非常感谢相关概念的链接。

谢谢

最佳答案

这只是函数箭头的中缀语法让你失望。首先,这是一个简单易懂的例子:Maybe Int .使其匹配proxy s ,我们只是设置:

proxy = Maybe
s = Int

现在让我们假装 a -> b改为 Fun a b ,等等 Zero有类型 Fun Zero Zero (即 (Fun Zero) Zero )。使其匹配 proxy s , 我们设置:
proxy = Fun Zero
s = Zero

实际上, proxy(->) Zero ,等等 proxy s((->) Zero) Zero(->) Zero ZeroZero -> Zero .

关于reflection - Haskell:为什么要进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979847/

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