Haskell - 函数签名

时间:2018-02-14 17:30:32

标签: haskell

我很难理解实施某些功能的问题。我有一个通用数据类型定义如下:

import qualified Data.Map.Strict as Map
data Stuff x = Stuff (Map.Map x [x])

当我尝试实现这样的功能时:

foo :: Ord x => x -> x -> Stuff x -> Stuff x
foo a b (Stuff c) = Stuff (Map.insert (a b c))

我收到错误:

Couldn't match expected type ‘Map.Map x [x]’
            with actual type ‘a0 -> Map.Map k0 a0 -> Map.Map k0 a0’

但是,当我在Haskell文档中验证签名时:

  

insert :: Ord k => k - > a - >映射k a - >映射k a

如果它返回"地图k a",则无法输入" a"是个名单?我怎么能转过" a"进入" [a]"?

1 个答案:

答案 0 :(得分:8)

(a b c)将函数a应用于参数bc,当您希望提供a b和{{ 1}}作为c的参数。您无法直接提供Map.insert,因为它的类型错误(b而不是x),但您可以创建要插入的单例列表:

[x]