【问题标题】:Standard definition of list列表的标准定义
【发布时间】:2011-08-01 14:45:09
【问题描述】:

我对列表的定义有疑问。通常列表定义为data [a] = [] | a : [a] 但是如果我在具体的代码上写这样的东西我会定义data T a = N | a -> (T a)解释器给我一个错误:

类型或类声明格式错误

你知道有什么问题吗? .

【问题讨论】:

    标签: list haskell types syntax


    【解决方案1】:

    a -> T a 意味着 a 是一个返回 T a 的函数,所以我认为这是错误的地方。试试这样的。

    data T a = N | R a (T a)
    

    N 是空列表(相当于[])值,R 是值构造函数(相当于:

    在右侧,您需要某种方式来携带a 值。您现在可以对列表进行正确的处理。

    > N -- The empty List
    > R 5 N -- a list with a single element and then the end
    > R 7 (R 6 (R 5 N)) -- the list 7, 6, 5
    

    【讨论】:

    • 谢谢,但我读到 (->) 是一个数据构造函数。真的很想定义一个没有固定数量参数的函数。例如函数来总结他们的论点: sum 5 = 5 ; sum 5 4 = 9 ...所以我必须使用 (->) 定义一个数据结构
    • (->) 是 type 构造函数,而不是数据构造函数。 (->) 接受两种类型(例如,a 和 b)并返回一个 type,表示从 a 类型的对象到 b 类型的对象的函数。
    • @877:在 Haskell 中定义可变参数函数有些困难:它的类型是什么?这是可能的(参见Text.Printf 模块),但这很少是您想要的。更常见的解决方案是让您的函数列出一个列表。确实,在 Prelude 中,有一个函数 sum,其类型为 Num a => [a] -> a
    【解决方案2】:

    看起来您的问题是您尝试使用-> 作为: 之类的中缀构造函数(为了使用a -> b -> N 语法构建列表)。这是不允许的,因为 Haskell 中的自定义中缀构造函数必须以 : 字符开头。

    您出现奇怪错误消息的原因是因为 Haskell 中的 -> 是为函数类型保留的,正如 Jeff's answer 所解释的那样

    试试这个:

    -- Create a right-associative infix constructor.
    data T a = N | a :-> (T a)
    infixr :->
    
    mylist :: T Int
    mylist = 10 :-> 17 :-> N
    
    --If we hadn't made the operator right associative,
    -- we would need to use explicit parenthesis here
    myotherlist :: T Int
    myotherlist = 10 :-> (17 :-> N)
    
    -- Example function
    isempty :: T a -> Bool
    isempty N         = True
    isempty (_ :-> _) = False
    

    【讨论】:

    • 表情比箭头好看多了。
    • 应该isempty N = True ?
    • 确实!现在修好了。
    猜你喜欢
    • 2018-08-13
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多