首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法推断(a ~ Set.Set (Set.Set a))

无法推断(a ~ Set.Set (Set.Set a))
EN

Stack Overflow用户
提问于 2013-10-30 16:03:51
回答 1查看 104关注 0票数 0

我需要帮助处理以下错误。基本上,对于给定的项目列表,我希望创建一个函数来检查项目是否在该列表中。为了做到这一点,我将列表转换为一个集合,然后在该集合周围创建一个闭包。

代码语言:javascript
复制
toAccept :: Ord a => [a] -> (a -> Bool)
toAccept xs =
    let xset = Set.fromList xs in
    let
    -- accept:: Ord a => a -> Bool
    accept x = Set.member xset x in 
    accept

我得到的是

代码语言:javascript
复制
Could not deduce (a ~ Set.Set (Set.Set a))
from the context (Ord a)
  bound by the type signature for
             toAccept :: Ord a => [a] -> a -> Bool
  at Tokens.hs:6:13-39
  `a' is a rigid type variable bound by
      the type signature for toAccept :: Ord a => [a] -> a -> Bool
      at Tokens.hs:6:13
Expected type: a -> Bool
  Actual type: Set.Set (Set.Set a) -> Bool
In the expression: accept
In the expression: let accept x = Set.member xset x in accept
In the expression:
  let xset = Set.fromList xs in
  let accept x = Set.member xset x in accept

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 16:09:17

你的论点失败了

代码语言:javascript
复制
let accept x = Set.member x xset in accept

作为一项规则,在haskell函数中,数据结构排在最后,因为这使得它能够接受无点样式。有关此问题的更多信息,请参见here

一种可能更好的写作方式是

代码语言:javascript
复制
toAccept' :: Ord a => [a] -> a -> Bool
toAccept' = flip Set.member . Set.fromList

这里我们利用了Haskell的运行特性,因为[a] -> a -> Bool[a] -> (a -> Bool)是相同的。实际上,我们可以编写函数,就像它接收两个参数而不使用一个参数一样,并返回一个函数,因为在Haskell中,这些选项是相同的。

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

https://stackoverflow.com/questions/19687943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档