检索Haskell记录中的字段数

时间:2014-04-12 10:09:25

标签: haskell

我代表一个表来存储数据作为Haskell记录,我想知道是否有一个函数来获取给定记录的字段数?

我问我有一个类型类来表示一个表,而一个类函数是 noOfCols ;它对应于表示表格的记录中的字段数。

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

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

instance Table Price where
   noOfCols t = 2
   ...

所以问题是我将不断添加新字段,以便在向添加新列(字段)时忘记更新 noOfCols 的实例实现价格的;即当我现在有3个或更多字段时,将它留到2。

是否有一个功能可以提供给定记录的字段数,因此每次更改记录时都不必进行手动编辑?

2 个答案:

答案 0 :(得分:4)

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

{-# 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

答案 1 :(得分:2)

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

noOfCols = arity Price

有关实施arity的方法,请参阅Haskell: Function to determine the arity of functions?(请参阅接受的答案)。 (注意:@kosmikus是恕我直言的更好的解决方案)。

网站注意:也许[[Float]]对你来说是更好的模型,即

type Price = [[Float]]

bid :: Price -> [Float]    
bid = (!! 0)

ask :: Price -> [Float]
ask = (!! 1)

noOfCols :: Price -> Int
noOfCols = length