Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 列表的“最大”功能是否仅在单独的功能中起作用?_List_Haskell - Fatal编程技术网

List 列表的“最大”功能是否仅在单独的功能中起作用?

List 列表的“最大”功能是否仅在单独的功能中起作用?,list,haskell,List,Haskell,移动数据时,我无法理解Haskell的错误。请在代码的不同部分列出最大函数。我正在使用一些内置函数来查找任意整数列表的模式。例如,当模式被赋予list list=[1,2,3,4,5,5,6,6,5,5,4,4,3,4,5,6,7,8,6,5,3,2,5]时,它应该返回5 当我将内置的最大值函数放入模式函数中时,如下所示: mode l = case l of [] -> [] (x : xs) -> let x = map length (group

移动数据时,我无法理解Haskell的错误。请在代码的不同部分列出最大函数。我正在使用一些内置函数来查找任意整数列表的模式。例如,当模式被赋予list list=[1,2,3,4,5,5,6,6,5,5,4,4,3,4,5,6,7,8,6,5,3,2,5]时,它应该返回5

当我将内置的最大值函数放入模式函数中时,如下所示:

mode l = case l of
    [] -> []
    (x : xs) ->
        let x = map length (group (sort l))
            y = map head (group (sort l))
        in  snd (maximum (zip x y)) --<-----<-----<-- This Line
但是,当我将模式功能分为模式和模式“with mode”执行最大值时,如下所示:

我使用ghci中的>mode'mode list在上面的列表中运行mode,得到了5的预期输出,没有错误

有人能解释为什么会出现这种情况吗?

请仔细查看模式中的case语句:

在您的工作示例中:

mode l = case l of
    [] -> []
    (x : xs) -> let ... in zip x y
模式的返回类型为列表。在损坏的版本中:

mode l = case l of
    [] -> []
    (x : xs) -> let ... in snd (maximum (zip x y))
第一个分支中的返回类型是一个列表,但第二个分支中的返回类型是一个整数,如zip x y::[Integer,a]。这是一个类型错误

在这种情况下,mode的另一个分支返回一个列表,因此类型是有效的:mode::Num a,Ord b=>[b]->[a,b],以及mode'typechecks

错误消息无法将类型“Integer”与“[a]”匹配,说明函数需要一个列表[a],但得到的却是一个整数:您的列表包含整数,因此您可以看出函数希望参数是列表列表:那么类型是有效模式::Ord a=>[[a]]->[a]。

当您说模式“模式”时,您可以将其内联为:

mode l = case l of
    [] -> snd (maximum [])
    (x : xs) ->
        let x = map length (group (sort l))
            y = map head (group (sort l))
        in snd (maximum (zip x y))
请注意,这与您的原始文件不同,因为无论列表是否为空,都会应用“模式”,而您的原始文件仅在非空的情况下应用它

还要注意的是,snd maximum[]会进行类型检查,但会引发运行时错误异常:Prelude.maximum:空列表。这意味着您仍然需要回答以下问题:对于空列表,我该怎么做

我想答案一定是空列表没有模式,所以你想返回的东西必须是一个Maybe。这意味着您可以使用以下定义:

mode l = case l of
    [] -> Nothing
    _ ->
        let x = map length (group (sort l))
            y = map head (group (sort l))
        in Just (snd (maximum (zip x y)))

请注意,我已将未使用的x:xs模式替换为uu,以避免在let中再次定义x时出现混淆。

预期的模式类型是什么?如果您将其添加到代码中会有所帮助,因为推断的类型似乎不是您期望的类型。为什么整数列表的模式是[]->[]中的空列表?您可能知道这一点,但您得到的错误是类型错误,而不是运行时错误,也就是说,这是一种在编译时在普通编译代码中捕获的错误。新用户有时对差异不清楚您的案例模型更有意义!所以我发现我的问题是,我在不同的案例中的返回类型不一致。假设我想返回一个数字,前面不带“Just”。是否有某种可以返回的空值,而不是空值,这样我就不必使用它了?顺便说一句,你也可以在一次通过l:Just的过程中进行计算。snd。最大限度映射\xs->长度xs,头部xs。组排序$lIs是否存在某种空值。。。?不,可能是因为我们不想要空数字。您必须在Haskell中明确表示缺少值。这被广泛认为是一项功能,而不是。当然,您可以自由选择自己的数字来表示空值,但这样您就不知道空列表模式与以该数字为模式的列表模式之间的区别了。您的解决方案很好地解释了为什么断开的版本在类型不匹配的情况下不起作用。我选择了另一个解决方案作为答案,因为它通过使用Maybe提供了所需模式函数的更好的最终版本。
mode l = case l of
    [] -> snd (maximum [])
    (x : xs) ->
        let x = map length (group (sort l))
            y = map head (group (sort l))
        in snd (maximum (zip x y))
mode l = case l of
    [] -> Nothing
    _ ->
        let x = map length (group (sort l))
            y = map head (group (sort l))
        in Just (snd (maximum (zip x y)))