首页 > 解决方案 > 在 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)]不会给我这个错误?

标签: haskell

解决方案


与您在列表中第一个元组的第一个元素中接受单个字符的方式相同;您希望那里有一个字符,只是写了一个变量名x来绑定到该字符的值。

任何时候你想接受任何值1作为参数,只需使用变量名;aor xor yor theCharacter,随便你喜欢的名字。

如果您编写的模式具有比这更多的结构(例如[a], or (x, y), or Just a, or ((x,y):xs)),那么您不仅接受任何参数值1,而且您正在编写仅适用于具有相同“形状”的值的模式匹配" 作为您的模式(例如[a],匹配一个只有一个元素((x,y):xs)的列表,匹配一个至少有一个元素的列表,该元素的第一个元素是 and 的元组,x尾部yxs,等等)。

在您使用模式的情况下,[a]Haskell 推断此参数的类型必须是某种列表。'a'是 a Char,它不是一个列表,所以这是一个类型错误。但是,如果您确实想在那里传递一个列表,那么您的模式仍然很可能是错误的。[a]匹配一个只有一个元素的列表;空列表或长于一个的列表与此模式不匹配,因此仅[a]当您有其他情况将涵盖包含零个或多个元素的列表时,才有意义将其用作模式。如果您只想接受任何列表而不关心您有多少元素,您可以做与任何其他类型相同的事情:只需写一个变量名。


1正确的类型。您仍然受制于函数及其参数的声明或推断类型的约束!


推荐阅读