list - Haskell 中的 [] (列表构造函数)是什么?

标签 list data-structures haskell types

我在理解仿函数时遇到问题,特别是 LYAH 中的具体类型。我相信这是因为我不明白 []真的是。

fmap :: (a -> b) -> f a -> f b  
  • [] ,类型构造函数?或者,它是一个值构造函数吗?
  • 具有以下类型是什么意思:[] :: [a] ?
  • 是不是像 Maybe类型构造函数,或 Just值构造函数?
  • 如果像 Just那怎么来Just有一个像 Just :: a -> Maybe a 这样的签名而不是 Just :: Maybe a ,换句话说,为什么不是 []输入 [] :: a -> [a]
  • LYAH这么说,因为它适用于仿函数:注意我们没有写实例仿函数 [a] where,因为从 fmap :: (a -> b) -> f a -> f b ,我们看到 f 必须是一个接受一种类型的类型构造函数。 [a]已经是一个具体类型(其中包含任何类型的列表),而 []是一个类型构造函数,它采用一种类型并且可以产生诸如 [Int] 之类的类型。 , [String]甚至[[String]] .我对 [] 的类型感到困惑暗示它就像 [a] 的文字LYAH 想要达到什么目的?
  • 最佳答案

    该类型(在 GHCI session 中)描述为:

    $ ghci
    Prelude> :info []
    data [] a = [] | a : [a] -- Defined 
    

    我们也可以将其视为定义为:
    data List a = Nil
                | Cons a (List a)
    

    或者
    data List a = EmptyList
                | ListElement a (List a)
    

    类型构造器
    [a]是一种多态数据类型,也可以写成[] a如上。这可能被认为是 List a
    在这种情况下,[]是一个类型构造函数,带有一个类型参数 a并返回类型 [] a , 也可以写成 [a] .

    可以编写如下函数的类型:
    sum :: (Num a) => [a] -> a
    

    数据构造器
    []是一个数据构造函数,本质上意味着“空列表”。此数据构造函数不接受值参数。

    还有另一个数据构造函数,: ,它将一个元素添加到另一个列表的前面。此数据构造函数的签名是 a : [a] - 它接受一个元素和另一个元素列表,并返回一个结果元素列表。
    []符号也可以用作构造列表的简写。通常我们会构建一个列表:
    myNums = 3 : 2 : 4 : 7 : 12 : 8 : []
    

    这被解释为
    myNums = 3 : (2 : (4 : (7 : (12 : (8 : [])))))
    

    但是 Haskell 也允许我们使用速记
    myNums = [ 3, 2, 4, 7, 12, 8 ]
    

    作为含义上的等价物,但在外观上稍微好一点,符号。

    暧昧案例

    有一种常见的模棱两可的情况:[a] .根据上下文,此表示法可以表示“a 的列表”或“只有一个元素的列表,即 a”。第一个含义是 [a] 时的预期含义。出现在一个类型中,而第二个含义是 [a] 时的预期含义。出现在一个值内。

    关于list - Haskell 中的 [] (列表构造函数)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2270277/

    相关文章:

    haskell - 从列表创建包/多重集

    haskell - 需要一个类型,但 ‘Request’ 的类型为 ‘* -> *’

    python list - 转换为列表列表

    python - Python 中 3 个不同长度列表的嵌套字典

    data-structures - prolog中的哈希表

    java - 有人可以向我介绍哈密顿循环吗?

    haskell - 复合镜头不能让绑定(bind)吗?

    c# - C# 中列表的继承,以及在 FindAll() 之后的显式转换

    python - 将列表分成行(从列表创建嵌套列表)

    c++ - 适合图中不断删除的最佳数据结构