Haskell 函数列表中的泛型类型
我有以下结构:Haskell 函数列表中的泛型类型,haskell,Haskell,我有以下结构: data BasicTypes = TypeS String | TypeI Integer deriving (Show, Ord, Eq) data MRF = MRF { lastValue :: BasicTypes, requestedFilters :: [RF] } deriving (Show) data RF = RF { event :: String, fi
data BasicTypes = TypeS String
| TypeI Integer
deriving (Show, Ord, Eq)
data MRF = MRF {
lastValue :: BasicTypes,
requestedFilters :: [RF]
} deriving (Show)
data RF = RF {
event :: String,
filters :: [Filter]
} deriving (Show)
type BooleanFunction a = a -> Bool
data Filter = Filter {
operation :: BooleanFunction BasicTypes,
value :: BasicTypes
} deriving (Show)
我想要一个MRF数据,它包含一个requestedFilters(RF)列表。每个RF都有滤波器,这些滤波器可以是字符串或整数类型
问题是过滤器是动态创建的,可以是字符串或整数值,因此我们可以:
Filter1 = Filter {operation = (==) 5, value = 3}
Filter2 = Filter {operation = (==) "hello", value = "hello"}
两个过滤器都包含在同一个MRF中
我想避免使用基本类型数据,并放置一个泛型类型,但是如果一个putoperation::a->Bool
那么所有的过滤器都应该是相同的类型(因此我不能将Integer->Bool
和String->Bool
放在同一个列表中)
你建议怎么做?谢谢
PS:我已经尝试过TypeRep类型,但是我找不到解决方案这对你有用吗
data Filter a = Filter { operation :: a -> Bool, value :: a }
data RF a = RF { event :: String; filters :: [ Filter a ] }
data MRF a = MRF { lastValue :: a, requestedFilters :: [RF a] }
在射频a
中,所有滤波器必须为滤波器a
类型
更新
我想为一个RF中的字符串创建一个过滤器列表,然后创建另一个带有整数列表的RF,然后创建另一个带有浮点列表的RF,依此类推。我希望所有这些射频都在一个列表(MRF)中 这个怎么样:
data MFRList = MRFList
{ integerMRFs :: [ MRF Integer ]
, stringMRFs :: [ MRF String ]
, floatMRFs :: [ MRF Float ]
}
根据需要添加尽可能多的字段。基本解决方案是为
过滤器使用两个构造函数:
data Filter
= FilterI {
operationI :: Int -> Bool,
valueI :: Int
}
| FilterS {
operationS :: String -> Bool,
valueS :: String
}
更高级的替代方案,使用GADT:
-- singleton
data BasicType t where
BasicI :: BasicType Int
BasicS :: BasicType String
data Filter where
Filter ::
{ ty :: BasicType t
, operation :: t -> Bool
, value :: t
} -> Filter
请注意,上面提到的重要一点是,可以在运行时测试字段ty
,以便我们可以发现实际是哪种类型的t
。例如:
useFilter :: Filter -> Int
useFilter (Filter BasicI op v) = v -- we know it's Int
useFilter (Filter BasicS op v) = length v -- we know it's String
我们也可以避免GADT,只使用简单的存在类型:
data Filter where
Filter ::
{ operation :: t -> Bool
, value :: t
} -> Filter
但是在这种情况下,Filter
实际上与Bool
同构:除了将它用作Filter
的参数之外,我们对value
无能为力。因此,这里的过滤器列表只是一个布尔值列表,这是无趣的
一般来说,如果您使用的是存在类型列表,那么您可能使用的是已知的。好,但是在MRF中,我可以使用带有不同过滤器的RFs吗?真正的问题是您希望如何处理MRF?如果尝试对字符串应用整数过滤器,您希望发生什么?你能用另一种语言展示一下你想要完成什么吗?我想要一个RF中字符串的过滤器列表,然后是一个带有整数列表的RF,然后是一个带有浮点列表的RF,依此类推。我希望所有这些射频都在一个列表(MRF)中。这将使MRF数据在输入时具有灵活性,我清楚了吗?如果我按照你的建议做,那么我将有一个只有一种类型的列表的MRF:/you’s Other idea?但是为什么你希望在同一个列表中有一个MRF整数和一个MRF字符串?编写一些代码(甚至是伪代码)来利用这样的列表,这样我们就可以看到您正试图完成的任务,我们也许可以提供一些替代方案。今天我将检查您的解决方案@ErikR,并让您知道。谢谢!如果将Filter1
应用于字符串,或将Filter2
应用于整数,会发生什么情况?有一个异构的过滤器列表是没有意义的。