首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展定义中的类型失配误差

问扩展定义中的类型失配误差
EN

Stack Overflow用户
提问于 2015-05-01 08:19:06
回答 1查看 88关注 0票数 0

我是哈斯克尔的新人。我遇到了一个错误。代码有点复杂,但我意识到它可以简化如下。

代码语言:javascript
复制
import Data.Set (Set)
import qualified Data.Set as S

oA :: S.Set String
oA = S.empty

main::IO()
main = do
    let oA = S.fromList["a1","a2","a3","a4","a5"]
    print [ a | a <- oA ]
    return ()

这给我一个错误,如下所示。

代码语言:javascript
复制
Module.hs:10:22:
    Couldn't match expected type `[t0]' with actual type `Set [Char]'
    In the expression: oA
    In a stmt of a list comprehension: a <- oA
    In the first argument of `print', namely `[a | a <- oA]'

我怎样才能解决这个问题?从其他编程语言(如java)的角度来看,[ Set [Char] a | a <- oA ]可能会工作,但Haskell编译器不接受这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-01 11:20:07

正如评论指出的那样,问题是清单中的理解必须是,嗯,清单。你试着用一个集合,这不是一个列表。

(有一个扩展,允许您对任意的monad使用相同的语法,但这仍然没有帮助。尽管从技术上讲,集合是一个单曲,但由于技术上的困难,您不能将Haskell的Set类型定义为monad。但这是另一个讨论。)

回应你的评论“我不明白Set和List的区别”.

首先,要明白计算机编程语言不像数学。他们可能使用从数学借来的术语,但也可能用它们来表达与你所期望的完全不同的意思。在任何时候,您都必须将集合的数学定义和Haskell提供的面向机器的Set数据类型分开。

在这种情况下,我们有list类型[x]和set类型Set x。

  • Set x是一种数据结构,它粗略地实现了您对数学集合的期望。它存储项目,您可以检查set成员资格,这在机器级别上是有效的。为了实现这一点,x必须具有完全的排序。(Set是作为搜索树实现的。)
  • [x]更像是一个数列的值。与Set不同,对于列表中的数据类型没有任何限制。此外,没有有效的成员资格查询。([x]是一个单链列表。)您所能做的是按照顺序有效地迭代元素。集合没有排序,而且Set迭代的速度也不是很快。

如您所见,为了从一个或多个现有的材料集合中构造一个新的东西集合,对于一个机器高效的作业,您需要的是[x],而不是Set x。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29983698

复制
相关文章

相似问题

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