2014-02-07 43 views
2

我想编辑顶点。我可以添加到它,但是当我使用更新我得到:haskell问题与Data.Map更新

Couldn't match expected type `(GLfloat, GLfloat, GLfloat) 
            -> Maybe (GLfloat, GLfloat, GLfloat)' 
       with actual type `(t0, t1, t2)' 
    In the first argument of `Map.update', namely `(- 0.75, 0.25, 0.0)' 
    In the expression: Map.update (- 0.75, 0.25, 0.0) "v1" faceMap 
    In an equation for `it': 
     it = Map.update (- 0.75, 0.25, 0.0) "v1" faceMap 

import qualified Data.Map as Map 
import Graphics.UI.GLUT 
import Graphics.Rendering.OpenGL 

faceMap :: Map.Map [Char] (GLfloat, GLfloat, GLfloat) 
faceMap = Map.fromList $ 
    [("v1", (-0.25, 0.25, 0.0)) 
    ,("v1", (0.75, 0.35, 0.0)) 
    ,("v3", (0.75, -0.15, 0.0)) 
    ,("v4", (-0.75, -0.25, 0.0)) 
    ] 

如果你知道不是编辑值,这将是伟大的以外的其他途径,是的,这是OpenGL的。

回答

5

Data.Map.updateinsert稍有不同(如果您交换参数,它应该在您的示例中工作)。

  • insert在地图上设置一个值,如果它已经存在替换它。

  • update执行查找并使用函数来定义基于前一个值的值。它可以返回Nothing以声明该密钥的值应该被删除,或者Just新值。

也许类型签名会更好地澄清:

update :: Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a 

insert :: Ord k => k -> a -> Map k a -> Map k a 
+0

这样的话我怎么可能用'insert'编辑我的价值观,而无需使用更新 – JoelWaterworth

+0

@JoelWaterworth的。再读第一段。 –

+0

哦对不起,谢谢 – JoelWaterworth