当前位置: 首页 > 知识库问答 >
问题:

为什么空列表上的函子合成返回显示错误?

夔修伟
2023-03-14

调用以下命令时,GHCI返回一个错误:由于使用“print”而产生的不明确类型变量“f0”、“b0”会阻止约束(Show(f0 b0))得到解决。

据我所知,这是因为我的表达式的类型是(数字b,函数f)=

然而,List的Functor实例将fmap定义为map,并且map的定义忽略了函数参数,以防第二个参数是[],从而简单地返回[]。这应该意味着我的表达式应该简单地返回[],而不管我应用了多少fmap组合,并且显示[]的调用应该通过。为什么我看到了错误?

(fmap.fmap) (+1) []

共有1个答案

谯阳伯
2023-03-14

确实,函数总是返回[],但是类型类分派(发生在编译时,而不是运行时)必须基于show的参数类型。[a]Show实例要求也解析Show a实例Show a=

这可能会让你问为什么show[]没有同样的问题,因为[]:[a]。这里的答案是,GHCi有一些特殊的扩展默认规则启发法,适用于某些简单的情况,以使在提示下工作更愉快。如果:set-xnoextendededefaultrules可以看到show[]将具有相同的行为。在您的例子中,由于列表的元素类型是f0 b0而不是单个类型变量,因此链接的扩展默认规则不适用,因此列表元素类型仍然包含不明确的类型变量。

通过自己解决一些类型约束,比如使用-XTypeApplications,可以看出这就是问题所在。即使解决了函子约束,也足以使正常的Haskell类型默认规则再次适用:(fmap.(fmap@[])(1)[]确实会在GHCi提示下打印[]

 类似资料:
  • 通过下面的代码片段,我试图运行一个查询,该查询更新数据或将新数据插入名为的表中。该表包含一个名为和的列。如果中已经有一个节点,则更新中以毫秒为单位的时间。否则,将插入新的信息。 问题是,下面的代码片段无法将数据插入到数据库的表中。原因是声明: 那么应该如何编辑代码,以便更新重复值并插入新值呢?

  • 会引发以下错误和异常: 路径为[]的上下文中servlet[dispatcherServlet]的servlet.Service()引发异常[请求处理失败;嵌套异常为org.springframework.http.converter.httpmessageConversionException:类型定义错误:[简单类型,类com.example.springrest.userdata];嵌套异常

  • (免责声明:人们通过facebook、firebase等请求询问使用异步操作时数据为空/不正确时,会产生很多问题。我提出这个问题的目的是为每个从android异步操作开始的人提供一个简单的答案。) 我试图从我的一个操作中获取数据,当我使用断点或日志调试它时,值就在那里,但当我运行它时,它们总是空的,我该如何解决这个问题呢? 火力基地 脸书 等。

  • 我不确定如何返回arraylist(删除null子列表),以及删除非null子列表中的null项。如果list为Null,则返回空arraylist。这就是我到目前为止所做的。

  • 问题内容: 我已经能够验证结果是否为。但是,它不返回列表。为什么? 问题答案: 对列表进行适当排序,即不返回新列表。写吧

  • 问题内容: 如果我有包含10个元素的列表: 为什么l [10]返回IndexError,而l [-1]返回0? 如果列表中没有以前的元素,我想做的就是抛出一个错误。 问题答案: 在Python中,负列表索引表示从列表右边开始计数的项(即的简写形式)。 如果发现需要负索引来指示错误,那么您可以简单地检查这种情况并亲自引发异常(或在那里进行处理):