将运算符与lambda函数关联的映射

时间:2011-01-06 11:58:46

标签: haskell lambda map

我有一个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

......对我没有多大帮助。

有什么建议吗?谢谢!

3 个答案:

答案 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返回EitherMaybe结果,以适应密钥不存在的可能性,但这取决于您。

可能定义如下:

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)