gpt4 book ai didi

haskell - 函数依赖中的模糊类型

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

在 haskell 中函数依赖 wiki :

给出这些定义:

data Vector = Vector Int Int deriving (Eq, Show)
data Matrix = Matrix Vector Vector deriving (Eq, Show)
instance Num Vector where
Vector a1 b1 + Vector a2 b2 = Vector (a1+a2) (b1+b2)
Vector a1 b1 - Vector a2 b2 = Vector (a1-a2) (b1-b2)
{- ... and so on ... -}

instance Num Matrix where
Matrix a1 b1 + Matrix a2 b2 = Matrix (a1+a2) (b1+b2)
Matrix a1 b1 - Matrix a2 b2 = Matrix (a1-a2) (b1-b2)
{- ... and so on ... -}
class Mult a b c where
(*) :: a -> b -> c

instance Mult Matrix Matrix Matrix where
{- ... -}

instance Mult Matrix Vector Vector where
{- ... -}

我不明白为什么类型不明确:

m1, m2, m3 :: Matrix
(m1 * m2) * m3 -- type error; type of (m1*m2) is ambiguous

很明显,当m1m2Matrix时,返回的唯一可能类型是Matrix,即应用 instance Mult Matrix Matrix Matrix

最佳答案

问题出在类型类声明上

class Mult a b c where
(*) :: a -> b -> c

通过对两个参数应用 (*),您无法确定结果的类型。假设您有两个实例:

instance Mult Int Int Int where ...
instance Mult Int Int Integer where ...

那么 2 * 4 可以是 Int 类型,也可以是 Integer 类型。

现在您可以争辩说您只有一个实例,因此编译器不应该提示。但是 Haskell 类型类生活在一个开放的世界中。您始终可以添加更多实例,并且它一定不能破坏其他地方的代码。因此,即使您只有一个实例,另一个库中的其他人也可以添加另一个实例。而且,您将有两个库,每个库都可以工作,但一起失败。这显然是不正确的。参见 Living in an open world在真实世界的 Haskell 中。

因此,通常类型类中函数的返回类型必须可从其参数派生。这正是函数依赖的目的。如果你声明

class Mult a b c | a b -> c where

那么编译器总能知道(*)的返回类型是什么。

关于haskell - 函数依赖中的模糊类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14691939/

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