【发布时间】:2018-02-20 11:27:57
【问题描述】:
split :: [a] -> Int -> ([a], [a])
split [xs] n =
(take n [xs], drop n [xs])
如果我将变量指定为xs 而不是[xs],则相同的代码可以工作,两种情况下的签名都是相同的。使用[xs] 会给出模式不是详尽无遗的错误。我知道这说明我提供的输入没有包含在我的代码中,但不清楚幕后发生了什么。
测试输入:[1,2,3] 2。
【问题讨论】:
-
好吧,
[xs]匹配具有恰好一个元素的列表,然后该元素与xs统一。不知何故,人们每隔一天就会问这个问题:( -
以后,请尽量给您的问题提供更具体的标题。 “Haskell 代码不起作用,为什么?”几乎没有说明你的问题。
-
@WillemVanOnsem 我同意,这个错误在这里太频繁了。我们可能需要写一个“参考”问题/答案,解决一般问题,以便我们可以关闭所有此类问题作为重复。我们这样做是为了限制单态性(在对 meta, IIRC 进行了一些讨论之后)。
-
我有一个反问:为什么你认为
[xs]和xs意思一样? -
@DanielWagner 我不希望 [xs] 与 xs 具有相同的含义,但是正如下面提到的(ans 中的 cmets),在声明您使用 [] 用于列表的类型时,主要混淆出现在 Haskell 中。加上因为我不经常使用 Haskell,所以默认情况下编写了这样的代码。如问题中所述,我知道如何使代码正常工作,并且部分理解了编译器抱怨的内容,但仍然无法了解整体情况。感谢您的回答,现在我知道更多了。也许将其添加为参考问题答案是个好主意。
标签: haskell