gpt4 book ai didi

haskell - Haskell 中的类型签名

转载 作者:行者123 更新时间:2023-12-02 21:32:47 25 4
gpt4 key购买 nike

我的问题是关于类型签名的。

以下代码符合:

data Vector a = Vector a a a deriving (Show) 
vMult :: (Num a) => Vector a -> a -> Vector a
(Vector i j k) `vMult` m = Vector (i*m) (j*m) (k*m)

但是,我不明白为什么用以下内容替换上述类型签名(第 2 行)不起作用:

vMult :: (Num a) => Vector a -> Num -> Vector a  

我的理解是,由于mNum类型(例如数字8),并且由于i, j , k 也是Num,计算Vector (i*m) (j*m) (k*m)应该没有问题。

请纠正我的理解。

最佳答案

Num a 实际上根本不是一种类型

Num 是一个类型类,所以如果我说 Num a 则意味着 a 是一个数字类型,所以

vMult :: (Num a) => Vector a -> a -> Vector a

表示“只要 a 是数字类型,vMult 就采用由 a 组成的向量和单个 a 并返回一个由 as 组成的向量。”

这意味着vMult可以像
一样工作vMult::Vector Int -> Int -> Vector Int
vMult::矢量 double -> double -> 矢量 double
请注意,您通过将原始数据中的所有 a 替换为单个数字类型来获得每种类型。

Num 本身没有意义

Num 本身意味着“是数字类型”,因此如果您的函数具有类型签名

vMult :: (Num a) => Vector a -> Num -> Vector a

它会显示“只要 a 是数字类型,vMult 就采用 a 的向量,并且 an 是数字类型并返回一个由a组成的向量。”这在英语中是不语法的,就像在 Haskell 中是错误一样。

这就像说“给我一些黄油和一把锋利的边缘”而不是“给我一些黄油和一把刀”。有效的类型签名就像是说“找到一些可以传播的东西(称之为 k),然后给我一些黄油和 k。”

事实不是类型

您也不能使用 Num a 代替 a,例如 Vector a -> Num a -> Vector a 因为您可以'不要在需要名词的地方添加断言:“给我你的 key 圈, key 是金属制成的,这样我就可以给你一个新的 key 圈”。

关于haskell - Haskell 中的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24291133/

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