我有一个Haskell Map,包含字符串作为键,一些lambda函数作为项。 例如:
-- List of supported Operators -> mapping with functions
ops = Map.fromList [("+", \x y -> x + y),
("-", \x y -> y - x),
("*", \x y -> x * y),
("/", \x y -> y / x)]
我想编写一个输入的函数:
基于运算符和ops映射,函数将评估sum / subtraction / etc.这两个数字。
我尝试过类似的事情:
(Map.lookup "+" a) 1 2
但它不起作用。
错误是:
Top level:
No instance for (Show (Integer -> Integer))
arising from use of `print' at Top level
Probable fix: add an instance declaration for (Show (Integer
In a 'do' expression: print it
<interactive>:1:1:
No instance for (Monad ((->) t))
arising from use of `Data.Map.lookup' at <interactive>:1:1-
Probable fix: add an instance declaration for (Monad ((->) t)
In the definition of `it': it = (Data.Map.lookup "+" a) 1 2
......对我没有多大帮助。
有什么建议吗?谢谢!
答案 0 :(得分:7)
查找的类型为lookup :: Ord k => k -> Map k a -> Maybe a
。结果包含在一个Maybe中,表示该键可能不存在于地图中。
这是一种可行的方法:
runOp :: String -> a -> a -> b
runOp key x y = case lookup key ops of
Just op -> op x y
Nothing -> error ("Couldn't find operator: " ++ key)
如果密钥不存在,这将触底。您还可以从runOp返回Either
或Maybe
结果,以适应密钥不存在的可能性,但这取决于您。
可能定义如下:
data Maybe a = Just a | Nothing
即,它保存结果值或空值。像一位存在主义哲学家一样,哈斯克尔强迫你承认Nothing
的可能性。
答案 1 :(得分:4)
首先,您显示的错误不是由您显示的代码引起的。您的代码导致以下错误(在ghc中):
Couldn't match expected type `t1 -> t2 -> t'
against inferred type `Data.Maybe.Maybe
该错误是由lookup
返回Maybe
这一事实引起的。所以你需要首先解开Maybe
。
答案 2 :(得分:2)