【问题标题】:Retrieving number of fields in Haskell record检索 Haskell 记录中的字段数
【发布时间】:2014-04-12 10:09:24
【问题描述】:

我正在表示一个将数据存储为 Haskell 记录的表,我想知道是否有一个函数可以获取给定记录的字段数?

我问,因为我有一个类型类来表示一个表,其中一个类函数是 noOfCols;对应于代表表的记录中的字段数。

data Price = Price {bid=[Float], ask=[Float]}

class Table a where
   noOfCols :: a -> Int
   ...

instance Table Price where
   noOfCols t = 2
   ...

所以问题是我会不断添加新字段,所以当我向 Price添加新列(字段)时,可能会忘记更新 noOfCols 的实例实现>;即当我现在有 3 个或更多字段时,将其保留为 2。

是否有可以为给定记录提供字段数量的功能,这样我每次更改记录时都不必手动编辑?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    这可以通过各种通用编程库来解决。例如:

    {-# LANGUAGE DeriveDataTypeable #-}
    
    import Data.Data
    
    data Price = Price {bid :: [Float], ask :: [Float]}
      deriving (Typeable, Data)
    
    noOfCols :: Data a => a -> Int
    noOfCols = gmapQl (+) 0 (const 1)
    

    然后:

    GHCi> noOfCols (Price [1,2] [3,4,5])
    2
    GHCi> noOfCols (0,0,0,0)
    4
    

    【讨论】:

      【解决方案2】:

      你的noOfCols是构造函数Price的arity,即

      noOfCols = arity Price
      

      请参阅 Haskell: Function to determine the arity of functions? 了解实现 arity 的方法(请参阅已接受的答案)。 (注意:@kosmikus 恕我直言,对您来说是一个更好的解决方案)。

      网站说明:也许[[Float]] 对您来说是一个更好的模型,即

      type Price = [[Float]]
      
      bid :: Price -> [Float]    
      bid = (!! 0)
      
      ask :: Price -> [Float]
      ask = (!! 1)
      
      noOfCols :: Price -> Int
      noOfCols = length
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        相关资源
        最近更新 更多