模式匹配Haskell中的不同输入

时间:2013-11-20 15:46:26

标签: haskell pattern-matching

抱歉,这可能与之前的问题类似,但我仍然有点困惑。以下是我使用的相同代码:

type Pig = String
type Lion = String
type Feed = [(Char,Char)]
type Visitors = [(Char,Char)]
type Costs = (Int,Int,Int)

data AnimalHome = Farm Pig Pig Pig Feed | Zoo Lion Lion Lion Feed Visitors

orders :: Char -> AnimalHome -> Costs -> Char
orders stuff (Farm p1 p2 p3 feed) (cost1,cost2,cost3) = some code here

但这次我想在成本不同的情况下执行不同的功能,即(1,3,9)执行不同的等式(0,0,16)等。

2 个答案:

答案 0 :(得分:1)

您可以根据此案例调整相关问题的答案。请记住,3元组或三元组(即您的类型成本)只是另一种数据类型。如果Haskell中没有元组,你可以写:

data Triple a b c = Triple a b c

它的行为与3元组完全相同!唯一的区别是Hakell支持元组表达式和元组模式的更方便的语法。

现在对于一般的模式:简化一下,有一些基本的3种可能性来编写它们:

  • 一个文字(仅适用于支持此类型的数据类型,如String,Int等),仅匹配该值。
  • 变量,匹配任何值
  • 数据构造函数,应用于模式。匹配使用子模式匹配的数据构造函数构造的值。

原来你已经在问题中写了正确的模式:

  

即。 (1,3,9)执行与(0,0,16)

不同的等式

因此

orders stuff (Farm p1 p2 p3 feed) (1,3,9) = some code here
orders stuff (Farm p1 p2 p3 feed) (0,0,16) = some other code here

如果我们能够理解模式匹配的具体问题,那么它可能会帮助我们。也就是说你为什么不能自己想出来,因为它感觉很自然,不是吗?

答案 1 :(得分:0)

如果你真的想要使用不同整数的不同函数,可以使用模式匹配

orders stuff (Farm p1 p2 p3 feed) (1,3,9) = -- one thing
orders stuff (Farm p1 p2 p3 feed) (0,0,16) = -- another thing

但我只对0使用它,而不是其他值。你真正想要的是卫兵:

orders stuff (Farm p1 p2 p3 feed) (a,b,c) 
       | a == 0 && b == 0  = -- one thing
       | a*b^2=c           = -- another thing
       | b < 0             = -- a third thing

并依次检查每个条件 - 只有第一个真实条件才能运行其代码。