对于Haskell中的任何内置类型,我都可以构建一个算术序列,就像这个例子(对于Int
或Integer
等类型):
[1..5]
但如果我定义了一个枚举类型:
data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum)
当我创建等差数列时,我必须在枚举实例和点点之前加上空格,例如:
[Club .. Diamond]
为什么?
对于Haskell中的任何内置类型,我都可以构建一个算术序列,就像这个例子(对于Int
或Integer
等类型):
[1..5]
但如果我定义了一个枚举类型:
data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum)
当我创建等差数列时,我必须在枚举实例和点点之前加上空格,例如:
[Club .. Diamond]
为什么?
modid.varsym
是模块中变量的引用。 modid
是由一个或多个大写标识符组成的序列,用点分隔,而varsym
是一个符号名称。 Club
是一个有效的modid
,.
是一个有效的varsym
(请注意,甚至在Prelude中有一个名为该名称的运算符,可以通过Prelude..
访问)。 因此,X..
被视为模块X
中名为.
的变量的限定名称。
因此,Club..Diamond
被标记为“限定变量名称、构造函数名称”,而不是“构造函数名称、点点、构造函数名称”1。当它尝试解析限定变量名称时,它会失败,因为实际上没有名为Club
的模块。
[1..5]
,因为1
不是有效的模块名称,也没有其他方式可以使1..
或1.
形成有效的令牌。请注意,与某些语言不同,1.
不允许作为写入1.0
的更短方式。如果是这样,你将遇到类似的问题,因为1..5
现在将被标记为“数字、点号、数字”。但它没有这样的情况,所以问题不会出现。
1“合格的变量名”胜过“构造函数名称,点点”,因为最大匹配规则认为当有多个可能性来匹配一个令牌时,应该选择从当前位置匹配最长子串的那个。
X..
表示模块 X
的变量 .
,而强制你写 X.(.)
来表示,这将消除这个词汇问题)。 - Giacomo Alzetta
[ f(x) | x <- myList ]
的表达式。 - Daniel McLaury