如何检查函数的参数并将其传递?

时间:2019-06-02 14:33:06

标签: haskell

我正在尝试编写一个函数,该函数需要一个我自己的命令及其参数(如果有)并仅传递该参数。当然,“ int”不在范围内,但是如果我尝试将其传递给x(例如“ f(x int)”),则会出现解析错误。我是Haskell的新手,感谢您的任何建议。

data Command = PushC Int | Pop | Push Int
f :: Command -> Int
f x | x == PushC int = int
    | x == Pop = 1
    | x == Push int = int
    | otherwise = -1

我只想检查任何Integer作为命令的参数并将其作为输出。如果命令没有参数输出1。

1 个答案:

答案 0 :(得分:8)

您确实应该在此处使用pattern matching [Haskell-wiki]

  object Body extends ErrorAccumulatingCirceSupport {

    def getIds(body: Body): List[String] = 
      body.things.get.flatMap(_.id4.getOrElse(List()))
    }

模式匹配比使用(==) :: Eq a => a -> a -> Bool更有效,首先,并非所有类型都是Eq的实例,而且您不能匹配数据的 parameters f :: Command -> Int f (PushC n) = n f (Push n) = n f Pop = 1的构造函数。因此,您可以匹配Eq,并希望Haskell像Prolog一样为some_val == PushC num分配一个值。

通常num(==)仅用于检查两个值是否相等,而不是在可能的数据构造函数和类型的参数之间进行区分。

您可以在此处最后一个子句使用通配符((/=)),但这样做可能更好(em> not ):如果以后再添加额外的_数据构造函数,编译器可以警告您并非所有模式都被覆盖,因此您可以提供正确的表达式。另一方面,如果您使用通配符,则该子句将自动与该数据构造函数匹配,这可能不是预期的效果。