【问题标题】:wraps [] around each top-level element of list将 [] 包裹在列表的每个顶级元素周围
【发布时间】:2017-06-29 03:23:19
【问题描述】:
wrap [1,2,3] should output [[1],[2],[3]]
wrap [[1],[2],[3]] should output [ [[1]], [[2]], [[3]] ]

我的实现是:

wrap [] = []
wrap (x:xs) = [x] :  [wrap xs]

并且haskell输出错误:Occurs check: cannotconstruct the infinite type: t ~ [t]

预期类型:[t] -> [t] 实际类型:[t] -> [[t]]

【问题讨论】:

  • wrap (x:xs) = [x] : wrap xs?
  • ^,但也只是wrap = map pure
  • @zerkms,导致无法将类型“a”与“[a]”匹配错误
  • @anru 它完全适合我¯\_(ツ)_/¯
  • @zerkms,我的错,我输入了 wrap :: [a] -> [a]

标签: haskell


【解决方案1】:

[wrap xs] 包装了wrap xs 的整个结果。您不想包装整个结果。您只想包装列表其余部分的每个单独元素,而这正是 wrap xs 已经做的事情。因此,wrap 是:

wrap :: [a] -> [[a]]
wrap [] = []
wrap (x:xs) = [x] : wrap xs

错误告诉您您正在尝试使用 [t],而 GHC 期望使用 t。这正是我们上面所说的,你包装的东西太多了。

【讨论】:

  • 谢谢,我知道我做错了什么,我的类型声明不存在。
  • 是的,GHC 很乐意为您推断wrap 的类型。不过,编写顶级类型声明是一种很好的做法,无论如何你都应该养成这种习惯。
  • 我的错,我输入了 wrap :: [a] -> [a]
  • 是的,在你告诉 GHC 你想要什么之前,你必须先知道你想要什么。 :)
  • @zerkms 你应该试试 Agda!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多