的Haskell; x
,y
:整数。
x : [y] : []
在这种情况下会发生什么? [y]
已添加[]
或x
先添加[y]
吗?结果是[x,[y]]
还是[[x,y]]
?
我很抱歉我的英语不好,谢谢你的帮助。
答案 0 :(得分:2)
您可以向ghci询问有关固定性信息的信息:
> :i :
data [] a = ... | a : [a] -- Defined in ‘GHC.Types’
infixr 5 :
暂时忽略第一行,第二行显示infixr 5
,这意味着:
关联到右边并具有优先权5.“关联到右边”表示运营商组“朝向右边“,所以e1 : e2 : e3
表示e1 : (e2 : e3)
。
其他选项包括infixl
(向左侧分组)和infix
(如果需要分组,则报告错误)。例如,e1 + e2 + e3
表示(e1 + e2) + e3
,因为+
为infixl
:
> :i +
class Num a where
(+) :: a -> a -> a
...
-- Defined in ‘GHC.Num’
infixl 6 +
而True == True == True
是一个解析错误,因为==
是infix
:
> :i ==
class Eq a where
(==) :: a -> a -> Bool
...
-- Defined in ‘GHC.Classes’
infix 4 ==
当有多个运算符时,优先级用于说明它们是如何分组的,但表达式只涉及一个运算符,即(:)
,因此不需要优先级来决定表达式的含义。< / p>
当然,您总是可以使用明确的括号来消除歧义或将操作符分组为“另一种方式”;例如(e1 : e2) : e3
也是一个有效的表达式,意味着与e1 : (e2 : e3)
不同,(True == True) == True
有效且即使True
无效,也会计算为True == True == True
。
以下是一些显示差异的例子:
> 1 : 2 : [3,4]
[1,2,3,4]
> 1 : (2 : [3,4])
[1,2,3,4]
> (1 : [2]) : [[3,4],[5]]
[[1,2],[3,4],[5]]
或者更重要的是:
> let e1 = []; e2 = ["ab","cd"]; e3 = [["ef","gh"],["ij"]]
> e1 : e2 : e3
[[],["ab","cd"],["ef","gh"],["ij"]]
> e1 : (e2 : e3)
[[],["ab","cd"],["ef","gh"],["ij"]]
> (e1 : e2) : e3
[["","ab","cd"],["ef","gh"],["ij"]]
(烹饪使这两种表达方式都很好的值很有趣!)
答案 1 :(得分:1)
查看类型
(:) :: a -> [a] -> [a]
单词:(:)
获取a
和a
的列表,并将其列为a
的列表。
因此,在x : [y] : []
中,第二部分[y] : []
是包含与y
相同类型的项目的列表的列表。因此x
必须是与y
具有相同类型的项目列表。 E.g。
y = 1
x = [2,3]
list = x:[y]:[]
且list
为[[2,3],[1]]
。
编辑:重读x
和y
应该是整数。那当然不行,看看解释并在ghci中尝试。