当前位置: 首页 > 知识库问答 >
问题:

Haskell非穷举模式与转换函数输出

公风史
2023-03-14

我有一个函数,它想列出所有数据类型

fn [] = []
fn (dt@(DataType t d y [(f,r)]):dts) = ["T:" ++ t ++ " D: " ++ d ++ " R: " ++ show y ++ "Ra" ++ show (fnAvg dt)] ++ fn dts

其中t和d是字符串,y是int,f是字符串,r是int(但不确定f和r是否重要,将进一步解释)。

我得到了非穷举模式的错误,并假设这是因为当列表中只有一个元素时,我没有一个,所以我在其他模式之间添加了这个:

fn [dt@(DataType t d y [(f,r)])] = ["T:" ++ t ++ " D: " ++ d ++ " R: " ++ show y ++ "Ra" ++ show (fnAvg dt)]

它已编译,但当我调用该函数时,它再次告诉我“非穷举模式”。我正在努力思考我错过了什么模式,我应该在之后添加一个通配符模式来捕获所有内容吗?我不想找人把答案打出来,但是欢迎你给我提示或建议。

共有2个答案

晁开宇
2023-03-14

您已经介绍了one-etent-list案例:它匹配fn(dt@(DataType t d y[(f, r)]):[]),因为dts可以是任何东西,包括空列表。

实际上,这里没有理由使用显式递归:您基本上有

f [] = []
f (x:xs) = g x ++ f xs

将其与列表的monad实例进行比较:

instance Monad [] where
  return x = [x]
  [] >>= _ = []
  (x:xs) >>= g = g x ++ (xs >>= g)

所以你应该把你的函数写成

fn l = l >>= \dt@( DataType t d y [(f,r)] ) 
    -> ["T:" ++ t ++ " D: " ++ d ++ " R: " ++ show y ++ "Ra" ++ show (fnAvg dt)]

虽然这并不能解决您的问题,但它使正在发生的事情变得显而易见:显然,DataType t d y[(f, r)]不是该类型的唯一有效模式。正如MathematicalOrchid所指出的,[(f, r)]只匹配长度为1的列表,但是您还需要覆盖其他长度。

fn l = l >>= \dt -> case dt of
   DataType t d y [(f,r)]
    -> ["T:" ++ t ++ " D: " ++ d ++ " R: " ++ show y ++ "Ra" ++ show (fnAvg dt)]
   DataType t d y []
    -> ["Some other stuff"]
   DataType t d y [(f,r), ...]
    -> ["Yet other stuff"]

或者随便什么。

事实上,如果您只在此处返回[(“stuff”)],那么您根本就没有真正使用一元绑定功能:您可以编写递归版本,而不必使用,只需使用重构对象,事实上,您只需执行一个映射操作:

fn = map $ \dt -> case dt of
   DataType t d y [(f,r)]
    -> "T:" ++ t ++ " D: " ++ d ++ " R: " ++ show y ++ "Ra" ++ show (fnAvg dt)
   DataType t d y []
    -> "Some other stuff"
   DataType t d y [(f,r), ...]
    -> "Yet other stuff"

元修然
2023-03-14

模式[(f,r)]仅在列表包含一个元素时匹配。如果它包含0、2或任何其他数字,则表示模式匹配失败。

在这个例子中代码应该做什么,我不能说。。。

 类似资料:
  • 我试图编写函数尾部,它将字符串转换成字符串列表,方式如下: 以下是我的实现: 正如标题所暗示的,这个函数中有一些非详尽的模式。不幸的是,我不明白为什么。 我是哈斯克尔的新手。。。任何帮助都将不胜感激!

  • 我必须使函数:: [((String, String), Int)]- 这就是我提出的功能: 输出应该是一个元组列表,其中的字符串与元组x1中的inputWord以及整数x2成对出现 问题是我得到了我认为不应该存在的非详尽模式。 我试图替换与 这使得非穷举模式在列表不为空时消失,但也阻止了函数遍历元组的最后一个元组。

  • 所以我有这个函数,当我尝试这样使用它时:mergesortedList[1,1][1,1]会给我一个错误: [1,1***异常:SortFunctions.hs:(86,1)-(91,89):函数合并分类列表中的非穷举模式 我无法找出问题的根源,因为我想我已经涵盖了所有可能的案例。这里会有什么问题?

  • 我使用返回元组的函数。但是当我试图运行这个函数时,它给了我一个例外:函数中的非穷尽模式。

  • 我得到了这个例外,有人知道如何摆脱它吗?' ***例外:hw.hs:(33,1)-(35,53):函数船舶中的非详尽模式' 所有函数都工作正常,除了函数。它可能与元组列表的东西,但我不能弄清楚。下面是代码:

  • 我正在尝试创建一个函数,该函数将元组列表作为参数,并按第二个元素排序。它不打印任何其他内容,只打印错误“***Exception:main”。hs:20:1-76:函数sortWords中的非穷举模式’以下是代码: 下面是我如何调用函数的 我得说我是在计算机上运行我的程序的http://Repl.it网站 谢谢!