gpt4 book ai didi

haskell - Haskell 中 (1 2) 的类型是什么?

转载 作者:行者123 更新时间:2023-12-03 14:55:08 26 4
gpt4 key购买 nike

今天我在玩拥抱,遇到了一个非常简单的问题:

λ 1 1
:: (Num a, Num (a -> t)) => t

那会是什么类型?我很难读到这个。

如果它有类型,为什么?我猜想表达式 1 1格式错误,因此类型检查失败,这是 Haskell 编译器支持的。

最佳答案

不,它不是格式错误的。该类型很奇怪,可能没有任何有意义的值,但它仍然是允许的。

请记住,文字是重载的。 1不是 一个整数。可以是 Num 类型的任何内容.函数不排除在外。没有规则说a -> t不能是“数字”(即 Num 的实例)。

例如,您可以有一个 instance声明如:

instance Num a => Num (a -> b) where
fromInteger x = undefined
[...]

现在 1 1将等于 undefined .不是很有用,但仍然有效。

您可以对 Num 进行有用的定义对于功能。例如,来自 wiki
instance Num b => Num (a -> b) where
negate = fmap negate
(+) = liftA2 (+)
(*) = liftA2 (*)
fromInteger = pure . fromInteger
abs = fmap abs
signum = fmap signum

有了这个,您可以编写如下内容:
f + g

在哪里 fg是返回数字的函数。

使用上面的实例声明 1 2将等于 1 .
基本上,用作上述实例的函数的文字等于 const <that-literal> .

关于haskell - Haskell 中 (1 2) 的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33102290/

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