gpt4 book ai didi

monads - 为什么 !-notation (bang-notation) 在 Idris REPL 中不起作用?

转载 作者:行者123 更新时间:2023-12-01 12:22:26 26 4
gpt4 key购买 nike

我希望它的计算结果为 3,但得到了一个错误:

Idris> :let x = Just 2
Idris> 1 + !x
(input):1:3-4:When checking an application of function Prelude.Interfaces.+:
Type mismatch between
Integer (Type of (_bindApp0))
and
Maybe b (Expected type)

我也在没有顶层绑定(bind)的情况下尝试了这个并得到了

Idris> let y = Just 2 in !y + 1
Maybe b is not a numeric type

最佳答案

问题在于 ! 符号如何脱糖。

当您编写 1 + !x 时,这基本上意味着 x >>=\x' => 1 + x'。而且这个表达式不进行类型检查。

Idris> :let x = Just 2
Idris> x >>= \x' => 1 + x'
(input):1:16-17:When checking an application of function Prelude.Interfaces.+:
Type mismatch between
Integer (Type of x')
and
Maybe b (Expected type)

但这很完美:

Idris> x >>= \x' => pure (1 + x')
Just 3 : Maybe Integer

所以你应该添加 pure 来让事情正常进行:

Idris> pure (1 + !x)
Just 3 : Maybe Integer

Idris repl 没有什么特别之处,这就是类型检查器的工作方式。这就是 Idris 教程中的 m_add 函数中有 pure 的原因:

m_add : Maybe Int -> Maybe Int -> Maybe Int
m_add x y = pure (!x + !y)

关于monads - 为什么 !-notation (bang-notation) 在 Idris REPL 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42987186/

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