gpt4 book ai didi

haskell - 当我在输入时遇到解析错误时,如何在 Haskell 中使用 (@) 运算符?

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

我是 Haskell 的新手,我正在尝试计算最大段总和,

(@) :: Int -> Int -> Int
x @ y = 0 `max` (x + y)

mss2 :: [Int] -> Int
mss2 = maximum . scanr (@) 0

错误是

没有为 (@) 加载模块

我在 Richard Bird 的文章中找到了这段代码。我在这里错过了什么?还有其他方法可以声明/重载运算符吗,我的方法错了吗?

最佳答案

似乎在那本书的上下文中,(@)正被用作 一些二元运算符 的替代品,例如 (+)(<>) ,即使这实际上不是合法的 Haskell 语法

有关 Haskell 语法的问题,咨询 Haskell 2010 Report 会很有帮助.

在 channel 。 2 词法结构,在 §2.2 Lexical Program Structure 下, 你可以找到 @在运算符名称中可能出现的符号语法中:

symbolascSymbol | uniSymbolspecial | _ | " | '

ascSymbol! | # | $ | % | & | | + | . | / | < | = | > | ? | @ | \ | ^ | | | - | ~ | :

§2.4 Lexical Structure: Identifiers and Operators定义有效的运算符名称以包含此类符号:

varsym → ( symbol: {symbol} )reservedop | dashes

consym → ( : {symbol} )reservedop

但是,尖括号中的下标表示“差异”或排除,因此不允许使用保留标识符列表。在生产 reservedop 下,您可以找到 @出现在该列表中:

reservedop.. | : | :: | = | \ | | | <- | -> | @ | ~ | =>

原因是 @符号表示 “as”模式,在 §3.17.2.8 Informal Semantics of Pattern Matching 中描述:

  1. Matching an as-pattern var@apat against a value v is the result of matching apat against v, augmented with the binding of var to v.

As 模式对于控制值的共享和使某些定义更简洁非常有用,例如:

-- | Merge two sorted lists.
merge :: (Ord a) => [a] -> [a] -> [a]

-- ‘as0’ & ‘bs0’ denote the original input lists.
-- ‘as’ & ‘bs’ denote their tails.

merge as0@(a : as) bs0@(b : bs) = case compare a b of

-- ‘as0’ passes along the same list cell;
-- repeating ‘a : as’ would allocate a /new/ cell.

GT -> b : merge as0 bs
_ -> a : merge as bs0

merge [] bs0 = bs0
merge as0 [] = as0

因此,定义:

x @ y = 0 `max` (x + y)

或者更传统的写法x@y = … , 等同于定义两个引用相同值的变量,并且递归定义:

x = 0 `max` (x + y)
y = x

没有类型签名 Int -> Int -> Int ,这个定义将被接受,定义 x, y :: (Ord a, Num a) => a ,但尝试计算任何一个变量都会产生无限循环,因为这是“非生产性”递归。

解决方案是使用非保留符号作为您的运算符名称,例如 <@>+. .

我找不到对此的引用,但是 GHC 过去可能接受这种语法,即使它是Haskell 98 Report 也不允许这在本书第一版出版时是最新的,而这个示例代码只是没有为第二版更新。

关于haskell - 当我在输入时遇到解析错误时,如何在 Haskell 中使用 (@) 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67542511/

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