Haskell列表语法:

时间:2017-01-28 08:39:00

标签: haskell

的Haskell; xy:整数。

x : [y] : []

在这种情况下会发生什么? [y]已添加[]x先添加[y]吗?结果是[x,[y]]还是[[x,y]]

我很抱歉我的英语不好,谢谢你的帮助。

2 个答案:

答案 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]

单词:(:)获取aa的列表,并将其列为a的列表。

因此,在x : [y] : []中,第二部分[y] : []是包含与y相同类型的项目的列表的列表。因此x必须是与y具有相同类型的项目列表。 E.g。

y = 1
x = [2,3]
list = x:[y]:[]

list[[2,3],[1]]

编辑:重读xy应该是整数。那当然不行,看看解释并在ghci中尝试。