我是哈斯克尔的新人。我遇到了一个错误。代码有点复杂,但我意识到它可以简化如下。
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 ()这给我一个错误,如下所示。
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编译器不接受这一点。
发布于 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。
https://stackoverflow.com/questions/29983698
复制相似问题