Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 函数列表中的泛型类型_Haskell - Fatal编程技术网

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中

我想避免使用基本类型数据,并放置一个泛型类型,但是如果一个put
operation::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
应用于整数,会发生什么情况?有一个异构的过滤器列表是没有意义的。