Haskell: Return 函数中的运算符(如 +、-、> 等)并执行运算

Haskell: Return an operator (like +, -, >, etc) from a function and perform the operation

我有两个变量,

let x = 3
let y = 4

我有一堆运算符,形式为 Plus、Minus、Lt、Gt、Gte 等

data Operator = Plus | Minus | Divide | Gt | Lt ....

我正在尝试编写一个接受运算符类型和 returns 实际运算符的函数。喜欢:

returnOperator :: Operator -> (Int->Int->a)
returnOperator op = case op of
                         Plus -> (+)
                         Minus -> (-)
                         Gt -> (>) 
                         ...etc

所以我能做到:

let output_op = returnOperator (Plus)
let z = x `output_op` y 
z = 7

举个例子。但是,我写的 returnOperator 函数给出了一个错误:

Couldn't match type ‘a’ with ‘Int’
      ‘a’ is a rigid type variable bound by
        the type signature for:
          returnOp :: forall a. Operator -> Int -> Int -> a

关于如何解决这个问题有什么建议吗?

一种方法是按类型分隔运算符。

data BoolOperator = Gt | Lt | ...
data IntOperator = Plus | Minus | Divide | ...

boolOp :: BoolOperator -> Int -> Int -> Bool
intOp :: IntOperator -> Int -> Int -> Int

一种边际效用值得怀疑的更高级方法是使用 GADT。

data Operator a where
    Plus :: Operator Int
    Gt :: Operator Bool

returnOperator :: Operator a -> Int -> Int -> a
returnOperator Plus = (+)
returnOperator Gt = (<)

请注意,这并没有您一开始想象的那么多。特别是,任何类似列表或 Map 的同类数据结构将无法同时存储 PlusGt,因为它们具有不同的类型。