【问题标题】:haskell - how to get specific map from another maphaskell - 如何从另一张地图获取特定地图
【发布时间】:2017-05-11 08:53:14
【问题描述】:
我想在 Haskell 中编写一个从地图返回特定地图的函数
我有:
import Data.Map as M
...
type m1 = M.Map Int Int
type m2 = M.Map Int m1
我正在尝试这样的事情:
getMap :: m1 -> Int -> m1
getMap e k = do
ret = M.lookup (M.size e) e
return $ fromJust $ ret
很遗憾,我没有返回 m1 类型。
【问题讨论】:
标签:
haskell
functional-programming
hashmap
【解决方案1】:
这里有几个问题:
- 您使用
do 表示法,这通常意味着您正在指定一个monad。
- 即使你想使用 monad,
ret = ... 语法也不是这样做的,那么它应该是 ret <- ...,... 是一个 monad;和
- 类型名称应以大写开头,而不是小写;
- 类型应该是
getMap :: M2 -> Int -> M1。
所以解决方法是:
import Data.Map as M
type M1 = M.Map Int Int -- uppercase types
type M2 = M.Map Int M1 -- uppercase types
getMap :: M2 -> Int -> M1 -- different type signature
getMap e k = fromJust $ M.lookup (M.size e) e -- pure function
话虽如此,从语义上讲,这不是有多大意义:你获取地图的M.size,甚至不使用k(不管你给出什么键,它总是返回相同的值 int 映射,或错误)。我认为您正在寻找:
getMap :: M2 -> Int -> M1
getMap e k = fromJust $ M.lookup k e
或替代版本:
getMap :: M2 -> Int -> M1
getMap = (fromJust .) . flip M.lookup