通过多行模式匹配的函数声明

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一样吗?或者它只是语言中的一个缺陷?或者我误解了什么?

Dan*_*ner 5

它既不是语言中的缺陷,也不表示您的方法是错误的.它仅仅是一种语法限制,作为令人讨厌的设计决策的一部分,必须以某种方式进行.

限制的吸引力在于它意味着在阅读代码时,人们不必担心它们错过了值的一部分定义,因为它分布在当前文件的远处.但它确实阻止了一些组织代码的完美逻辑方式,包括您当前尝试使用的方法.

真可惜我们两个都不能拥有!

人们可以考虑做这样的事情:

data Stats = Stats
    { isBig :: Bool
    , isLoyal :: Bool
    , -- ...
    }

stats :: Animal -> Stats
stats Cat = Stats
    { isBig = False
    , isLoyal = False
    }
Run Code Online (Sandbox Code Playgroud)