【发布时间】:2017-03-27 20:42:09
【问题描述】:
我正在学习 Haskell,并且一直在编写各种相当琐碎的函数来掌握该语言。我写了这个函数:
doubleOneOrTail :: [t]->[t]
doubleOneOrTail [x] = [x,x]
doubleOneOrTail (x:xs) = xs
这正是所说的。将 1 个元素的列表加倍,或返回多个元素列表的尾部。这种通用语法适用于单个元素列表或列表列表等。我可以将此函数重写为以下内容:
doubleOneOrTail :: [[t]]->[[t]]
doubleOneOrTail [[x]] = [[x,x]]
doubleOneOrTail (x:xs) = xs
如果我输入以下内容,这将引发错误:
doubleOneOrTail [1,2,3]
但它确实接受这一点:
doubleOneOrTail [[[[1,2,3],[2]]]]
将其视为具有单个元素的列表(该元素是列表的列表)并将其加倍。
显然,模式 [a]->[a] 不匹配单个元素的列表,但在某种程度上匹配任何列表顺序。 Whlie [[a]]->[[a]] 也匹配多个列表顺序(尽管不是仅包含单个元素的列表)。如果有人能解释这是如何工作的,将不胜感激。
第二个问题是有可能(甚至是可取的)有一个函数声明,它专门采用列表的特定顺序。只说列表?
【问题讨论】:
标签: haskell