use*_*762 2 haskell function pattern-matching
我希望有这个漂亮,干净的方式来描述具有函数和模式匹配的对象的属性:
data Animal = Cat | Dog | Cow
isBig :: Animal -> Bool
isLoyal :: Animal -> Bool
-- many more possible properties, including complicated non-bools, methods, and whatnot
--- Describing Cat
isBig Cat = False
isLoyal Cat = False
--- more properties
--- Describing Dog
isBig Dog = False
isLoyal Dog = True
--- more properties
--- Describing Cow
isBig Cow = True
isLoyal Cow = False
--- more properties
Run Code Online (Sandbox Code Playgroud)
但是,这会产生有关多个声明的错误.因为,显然,通过模式匹配的函数定义必须在连续的行中完成.
这表明我的方法是错误的,不像Haskell一样吗?或者它只是语言中的一个缺陷?或者我误解了什么?
它既不是语言中的缺陷,也不表示您的方法是错误的.它仅仅是一种语法限制,作为令人讨厌的设计决策的一部分,必须以某种方式进行.
限制的吸引力在于它意味着在阅读代码时,人们不必担心它们错过了值的一部分定义,因为它分布在当前文件的远处.但它确实阻止了一些组织代码的完美逻辑方式,包括您当前尝试使用的方法.
真可惜我们两个都不能拥有!
人们可以考虑做这样的事情:
data Stats = Stats
{ isBig :: Bool
, isLoyal :: Bool
, -- ...
}
stats :: Animal -> Stats
stats Cat = Stats
{ isBig = False
, isLoyal = False
}
Run Code Online (Sandbox Code Playgroud)