gpt4 book ai didi

function - 运算符的 Haskell 类型优先级高于函数

转载 作者:行者123 更新时间:2023-12-02 15:36:23 25 4
gpt4 key购买 nike

我必须导出这个函数的类型:

func x = map -1 x

而且我已经找到了一种方法,使用提示将其更改为 lambda 表达式:

func = \x -> (map) - (1 x)

如果我这样表达,它很好,我得到与原始类型相同的类型,但我不确定为什么它会这样分组。谁能解释一下?

比如,为什么不是这样:

func = \x -> (map - 1) x

或类似的东西。

我知道这是一个无用的函数等等。但是我不能改变这个函数,我只需要导出它的类型。

如果你把这个函数写在一个文件里,例如:test.hs 有 func x = map -1 x并在解释器中使用 :t func,它会回复:

func :: (Num (t -> (a -> b) -> [a] -> [b]),
Num ((a -> b) -> [a] -> [b])) =>
t -> (a -> b) -> [a] -> [b]

最佳答案

我现在相信你是想问为什么

func x = map -1 x

的类型为 (Num (t -> (a -> b) -> [a] -> [b]), Num ((a -> b) -> [a] -> [b ])) => t -> (a -> b) -> [a] -> [b],以及如何将表达式括起来以使其具有该类型。

首先,您必须认识到空格是 haskell 中的一个运算符,并且具有最高的优先级。

让我们使用 # 而不是空格,我们可以使用最高优先级:

infixl 9 #
f # x = f x

我们可以用 # 代替运算符和空格:

func x = map - 1 # x

因为 1 和 x 之间的空格是唯一没有运算符的空格(- 位于 map1 之间)。

由于#的优先级高于-,我们得到

func x = map - (1 # x)

或等效

func x = map - (1 x)

另一个例子

func2 x = map (-1) x
> :t func2
func2 :: Num (a -> b) => [a] -> [b]

这翻译成

func2' x = map # (-1) # x

但为什么 -1 之间没有#?在这种情况下,像 1 这样的数字文字前面的 - 表示 negate:

> (-1)
-1
> (negate 1)
-1
> (subtract 1)
<interactive>:73:1:
No instance for (Show (a0 -> a0))
arising from a use of `print'
Possible fix: add an instance declaration for (Show (a0 -> a0))
In a stmt of an interactive GHCi command: print it

所以这个函数试图将 1 的负数映射到一个列表上。为此,它需要负 1 才能成为函数,这就是为什么它需要函数的数字实例(类型开头的 Num (a->b) =>) .

关于function - 运算符的 Haskell 类型优先级高于函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16797728/

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