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
的同类数据结构将无法同时存储 Plus
和 Gt
,因为它们具有不同的类型。
我有两个变量,
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
的同类数据结构将无法同时存储 Plus
和 Gt
,因为它们具有不同的类型。