gpt4 book ai didi

haskell - 'infix' 是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 21:08:56 24 4
gpt4 key购买 nike

我在玩infixr , infixlinfix声明。我明白了infixrinfixl作品:

-- Test expression: 40 +++ 20 +++ 50 +++ 10 * 10

-- infixr 8 +++ -- Calculated as: (40 +++ (20 +++ (50 +++ 10))) * 10. Result: 630.
-- infixl 8 +++ -- Calculated as: (((40 +++ 20) +++ 50) +++ 10) * 10. Result: 800.

-- infixr 6 +++ -- Calculated as: 40 +++ (20 +++ (50 +++ (10 * 10))). Result: 75.
-- infixl 6 +++ -- Calculated as: ((40 +++ 20) +++ 50) +++ (10 * 10). Result: 125.

(+++) :: Int -> Int -> Int
a +++ b = a + (b `div` 2)

但我不明白 infix关键字有效。我对 infix 的看法是对的吗?您总是需要用括号指定顺序吗?如果是这样,考虑到括号具有最高优先级,为什么需要数字参数)?

最佳答案

tl;博士
rl指关联性,您指定的数字指的是运算符优先级。当您不指定关联性时,您将获得一个只能通过显式括号关联的运算符,或者当关联性不明确时。

我们的测试数据结构

让我们使用数据结构来定义运算符并了解关联性是如何工作的:

data Test = Test String deriving (Eq, Show)

它将包含使用以下运算符构建的字符串。

infixr 的关联性和 infixl
现在让我们定义右关联运算符和左关联运算符:
(>:) :: Test -> Test -> Test
(Test a) >: (Test b) = Test $ "(" ++ a ++ " >: " ++ b ++ ")"

(<:) :: Test -> Test -> Test
(Test a) <: (Test b) = Test $ "(" ++ a ++ " <: " ++ b ++ ")"

infixr 6 >:
infixl 6 <:

这些运算符将通过显式将括号添加到我们的关联项来构造结果运算符的字符串。

如果我们对其进行测试,我们会发现它可以正常工作:
print $ (Test "1") >: (Test "2") >: (Test "4")
-- Test "(1 >: (2 >: 4))"

print $ (Test "1") <: (Test "2") <: (Test "4")
-- Test "((1 <: 2) <: 4)"

infix 的“关联性”

一个 infix声明未指定关联性。那么在这些情况下应该怎么办呢?让我们来看看:
(?:) :: Test -> Test -> Test
(Test a) ?: (Test b) = Test $ "(" ++ a ++ " ?: " ++ b ++ ")"

infix 6 ?:

然后让我们尝试一下:
print $ (Test "1") ?: (Test "2") ?: (Test "4")

糟糕,我们得到:

Precedence parsing error cannot mix `?:' [infix 6] and `?:' [infix 6] in the same infix expression



如您所见,语言解析器注意到我们没有指定运算符的关联性并且不知道该做什么。

如果我们改为删除最后一项:
print $ (Test "1") ?: (Test "2")
-- Test "(1 ?: 2)"

然后编译器不会提示。

要修复原始术语,我们需要显式添加括号;例如:
print $ (Test "1") ?: ((Test "2") ?: (Test "4"))
-- Test "(1 ?: (2 ?: 4))"

Live demo

关于haskell - 'infix' 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770118/

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