【问题标题】:list of nested empty lists in HaskellHaskell 中嵌套空列表的列表
【发布时间】:2019-02-27 03:25:43
【问题描述】:

为什么可以在 Haskell 中制作这样的列表:

slist = [ [], [[]], [[],[[]]] ]

据我所知,这里的每个元素都有不同的类型(如数学中的:Ø、{Ø} 等)。 ghci 说:

> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]

在形式上,我看到了不同的注释。

换句话说,第一个元素是一个简单的空列表,第二个元素是一个列表 (!) 的列表,依此类推。

怎么了?为什么 Haskell 认为它们是同一类型?

【问题讨论】:

  • 如果您想制作这样的“列表”,请考虑data NestList a = Elem a | Nest [a],然后您可以将Nest [ Nest [], Nest [ Nest [] ] ] 写入任意深度。
  • @AJFarmar 也许你的意思是data NestedList a = Elem a | Nest [NestedList a]
  • @WillNess 你是对的,但我现在不能改变它!

标签: list haskell types


【解决方案1】:

你是对的,在 Haskell 列表中,所有元素必须属于同一类型。实际上,您示例中的类型是:

> :t slist
slist :: [[[[a]]]]

但是空列表[]可以有任何类型,只要它是[b]的形式,但是bs有很多可能的。所以有很多可能的具体类型。其中之一是b 的类型为[[[a]]],如您的slist

【讨论】:

    【解决方案2】:

    空列表可以是任何类型的列表。它可以是数字列表、字符串列表或列表列表。我的意思是,为什么不允许你有一个空的列表列表,甚至是一个空的列表列表?

    所以在你的列表中:

    --a     b       c     d
    [ [], [ [] ], [ [], [ [] ] ] ]
    

    d 是一个空列表,c 是一个空列表列表,b 是一个空列表列表,a 是一个空列表列表列表。

    【讨论】:

    • @Vladimir 你是什么意思?我只是从您的问题中复制并粘贴了列表并命名了空列表。
    • slist只有3个元素,见length slist
    • @Vladimir 我标记的是空列表,而不是 slist 的元素。我添加了一些空格以使其更清晰。
    • 那你为什么在一个记录中使用两个字母(a和c)作为空列表?
    • @Vladimir 因为这里不同的空列表有不同的类型。例如a 的类型等于[b] 的类型(但特别是b 的类型不一样)。所以列表的元素都具有相同的类型,因为单个空列表没有。
    【解决方案3】:

    看看这样一个列表的第一个元素的类型:

    > head [ [], [[]], [[],[[]]] ]
    []
    it :: [[[t]]]
    

    不是t,而是[[[t]]]

    为什么我可以在 Haskell 中制作这样的列表

    因为这个表达式的类型没有错。

    怎么了?为什么 Haskell 认为它们是同一类型?

    [[[[t]]]] 中的t 不是最终类型,它是类型变量。这就是为什么这个列表的第一个元素的类型可能是a[b][[c]][[[t]]]

    【讨论】:

    • 我们可以强调这只是因为使用了 several 字面量[]s,但如果我们尝试let s=[[], [[]]] in [s, [s], [[s]]],那么它就不行了。 .. 可能 ...... 等等 ..... 不,它也有效! :) 因为s 不是“一个东西”,而是“一个多态的 i> 定义”!真正不起作用的是(\s -> [s, [s], [[s]]]) [[], [[]]],因为 lambda 函数的参数类型是单态的。
    猜你喜欢
    • 2022-01-20
    • 2012-02-25
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多