我正在尝试编写一个函数,该函数需要一个我自己的命令及其参数(如果有)并仅传递该参数。当然,“ 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。
答案 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 ):如果以后再添加额外的_
数据构造函数,编译器可以警告您并非所有模式都被覆盖,因此您可以提供正确的表达式。另一方面,如果您使用通配符,则该子句将自动与该数据构造函数匹配,这可能不是预期的效果。