haskell - 在 Haskell 函数中提取参数
问题描述
我有一个函数,它接受一个字符和一个元组列表,并显示元组中的一个元素。这是功能:
foo [a] ((x,y):xs) = x
但是,当我尝试运行时,它编译得很好
foo 'a' [('b',1),('c',2)]
它给了我这个错误:
<interactive>:2:5: error:
• Couldn't match expected type ‘[a10]’ with actual type ‘Char’
• In the first argument of ‘foo’, namely ‘'a'’
In the expression: foo 'a' [('b', 1), ('c', 2)]
In an equation for ‘it’: it = foo 'a' [('b', 1), ('c', 2)]
如何在 foo 的定义中声明一个字符“a”,这样foo 'a' [('b',1),('c',2)]
不会给我这个错误?
解决方案
与您在列表中第一个元组的第一个元素中接受单个字符的方式相同;您希望那里有一个字符,只是写了一个变量名x
来绑定到该字符的值。
任何时候你想接受任何值1作为参数,只需使用变量名;a
or x
or y
or theCharacter
,随便你喜欢的名字。
如果您编写的模式具有比这更多的结构(例如[a]
, or (x, y)
, or Just a
, or ((x,y):xs)
),那么您不仅接受任何参数值1,而且您正在编写仅适用于具有相同“形状”的值的模式匹配" 作为您的模式(例如[a]
,匹配一个只有一个元素((x,y):xs)
的列表,匹配一个至少有一个元素的列表,该元素的第一个元素是 and 的元组,x
尾部y
是xs
,等等)。
在您使用模式的情况下,[a]
Haskell 推断此参数的类型必须是某种列表。'a'
是 a Char
,它不是一个列表,所以这是一个类型错误。但是,如果您确实想在那里传递一个列表,那么您的模式仍然很可能是错误的。[a]
匹配一个只有一个元素的列表;空列表或长于一个的列表与此模式不匹配,因此仅[a]
当您有其他情况将涵盖包含零个或多个元素的列表时,才有意义将其用作模式。如果您只想接受任何列表而不关心您有多少元素,您可以做与任何其他类型相同的事情:只需写一个变量名。
1正确的类型。您仍然受制于函数及其参数的声明或推断类型的约束!
推荐阅读
- python - Pandas - 从 excel 中读取表格
- spring-boot - 基于 docker 环境变量切换 spring 配置文件不起作用
- jquery - 如何从链接单击添加数据到表单字段
- node.js - 如何根据另一个 JSON 对象中的字符串为 JSON 对象选择键值
- ruby-on-rails - 当更改的属性在“回调后”中是干净的时,如何依赖脏模型?
- scala - 将 HiveQL 转换为 Spark Scala
- push-notification - 应用客户端如何处理传入的即时消息和通知?
- html - 在不退出 tr 的情况下在表中创建新行
- html - CSS - 对齐 div 的 Flex 属性
- parsing - 简单的 HTML DOM 无法在 TR 中获得第一个 TD