首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不!-notation (爆炸符号)在Idris中工作?

为什么不!-notation (爆炸符号)在Idris中工作?
EN

Stack Overflow用户
提问于 2017-03-23 21:19:12
回答 1查看 236关注 0票数 3

我预期这个值为3,但得到了一个错误:

代码语言:javascript
复制
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)

我也试过这个,没有一个托普莱尔绑定,并得到

代码语言:javascript
复制
Idris> let y = Just 2 in !y + 1
Maybe b is not a numeric type
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-24 10:20:01

问题的事实是如何!-notation脱糖。

当您编写1 + !x时,这基本上意味着x >>= \x' => 1 + x'。这个表达式不键入check。

代码语言:javascript
复制
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)

但这是完美的:

代码语言:javascript
复制
Idris> x >>= \x' => pure (1 + x')
Just 3 : Maybe Integer

因此,您应该添加pure以使其正常工作:

代码语言:javascript
复制
Idris> pure (1 + !x)
Just 3 : Maybe Integer

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

代码语言:javascript
复制
m_add : Maybe Int -> Maybe Int -> Maybe Int
m_add x y = pure (!x + !y)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42987186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档