【问题标题】:How to use the syntax and access values in custom data types in Haskell?如何在 Haskell 中使用自定义数据类型的语法和访问值?
【发布时间】:2022-01-15 04:17:55
【问题描述】:

我的数据类型定义如下:

data MyType a = MyType Weight [a]

权重是type Weight = Integer.

我不太明白这里发生了什么。 MyType 是由整数组成还是由 [a] 组成,还是两者兼而有之?

就我而言,我得到了MyType (a,b),我想知道这是(a,b) 的列表,如果是,我需要使用什么语法才能仅提取@987654327 的列表@?

【问题讨论】:

    标签: haskell types algebraic-data-types custom-data-type


    【解决方案1】:

    如你所说,

    data MyType a  =  MkMyType    Weight        [a]
         --------     --------    ------        ---
    --   type         data        type of      type of
    --              constructor   1st field    2nd field
    

    定义数据类型。请注意,我做了一个小改动,将MkMyType 写在= 的右侧,以区别于左侧的MyType

    现在,对于任何特定的aMyType a 是一个数据 类型——它是一种可以出现在定义的右侧。

    MkMyType 虽然(Weight -> [a] -> MyType a 类型)是一个数据构造函数。应用于Weight-type 值和[a]-type 值,它会创建一个MyType a 类型的,它确实保留了两个值同时 -- 一个Weight-type 值和一个[a]-type 值,它们是在创建时给它的。

    这个值如何在计算机内存中表示并不重要。重要的是我们可以在其上进行模式匹配,例如

    foo :: MyType a        ->  (Weigth, [a])
    foo (MkMyType  w     as)  =  (w, as)
        --------------------
    --  pattern   1st    2nd
    --           field  field
    

    请注意,在值MkMyType w as 中,我们有w 类型为Weight(我们写为:w :: Weight),我们还有as 类型为[a]——具有相同的@987654341 @ 出现在整体类型中。

    因此我们也可以定义

    bar :: MyType (a,b) -> (Weigth, [(b,a)])
    bar (MkMyType w abs)  =  (w, [(b,a) | (a,b) <- abs])
    

    再一次,这里我们有abs :: [(a,b)],因为参数值的类型是MyType (a,b)——具有相同的ab

    所以如果你只想从abs获取as的列表,可以这样写

    baz :: MyType (a,b) -> [a]
    baz (MkMyType _ abs)  =  takeFirsts abs
    

    这里你需要实现

    takeFirsts :: [(a,b)] -> [a]
    takeFirsts abs  =  ...
    

    我留给你完成,作为练习。

    【讨论】:

      【解决方案2】:

      MyType 是由Int[a] 组成的类型,所以它两者都有。要从类型中提取列表,可以使用模式匹配:

      getList :: MyType a -> [a]
      getList (MyType _ a) = a
      

      或者,您可以使用record syntax 声明类型:

      data MyType a = MyType { getWeight :: Weight, getList :: [a] }
      

      自动生成解包函数,让getList (MyType 2 [3,4]) == [3,4])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-08
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多