首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将运算符与lambda函数关联的Map

将运算符与lambda函数关联的Map
EN

Stack Overflow用户
提问于 2011-01-06 03:58:45
回答 3查看 546关注 0票数 3

我有一个Haskell,包含字符串作为键,一些lambda函数作为项。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 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)]

我想编写一个函数作为输入:

  • 表示运算符"+“、"-”、"*“、”
  • 2 numbers

“的字符串

该函数基于算子和ops映射,求出这两个数字的和/减/等。

我试过这样的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(Map.lookup "+" a) 1 2

但这不管用。

错误是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

..。对我没多大帮助。

有什么建议吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-06 04:46:01

查找是lookup :: Ord k => k -> Map k a -> Maybe a类型的。结果封装在一个可能的指示键可能不存在于映射中。

下面是一种可行的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

如果密钥不存在,这将是最低的。您还可以从Either返回Maybe或runOp结果,以适应密钥不存在的可能性,但这取决于您。

可能定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data Maybe a = Just a | Nothing

也就是说,它要么保存一个结果值,要么保存一个空值。像一个存在主义哲学家,哈斯克尔强迫你承认Nothing的可能性。

票数 7
EN

Stack Overflow用户

发布于 2011-01-06 04:09:09

首先,您显示的错误不是由您显示的代码造成的。代码会导致以下错误(在ghc中):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Couldn't match expected type `t1 -> t2 -> t'
against inferred type `Data.Maybe.Maybe

该错误是由lookup返回一个Maybe这一事实造成的。因此,您需要首先展开Maybe

票数 4
EN

Stack Overflow用户

发布于 2011-01-06 07:52:35

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Control.Applicative

ops :: (Fractional a) => Map.Map String (a -> a -> a)
ops = Map.fromList [("+", (+)),
                    ("-", flip (-)),
                    ("*", (*)),
                    ("/", flip (/))]

apply :: (Fractional a) => String -> a -> a -> Maybe a
apply op x y = Map.lookup op ops <*> y <*> x

因为lookup返回一个Maybe a (在本例中是Maybe (a -> a -> a) ),所以无法将其直接应用于a。我们可以使用<*>将LHS从mote中提取出来,将其应用于RHS,并将其注入monad中。(或者像Bill那样手工操作。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4614662

复制
相关文章

相似问题

重写map::直接与lambda函数比较

43

如何将lambda函数与Python中的def函数关联起来?

35

在map中使用重复函数与lambda函数

24

Haskell:理解与lambda函数一起使用的map函数

10

带有map函数的Scala lambda函数

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文