2017-05-11 6 views
1

から特定のマップを取得する方法:ハスケル - 私は私が持っているマップ</p> <p>から特定のマップを返す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タイプが返されました。

答えて

0

はここにいくつかの問題があります。

  • あなたは通常、あなたがモナドを指定していることを意味do表記を使用します。
  • あなたがモナドを使用したい場合でも、ret = ...構文はそれを行うことになって仕方ありませんが、それは...モナドで、ret <- ...されている必要があります。
  • タイプ名は、大文字ので始まります。小文字ではありません。
  • タイプはおそらく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 
関連する問題