如何理解Haskell中的SomeInts Int Ints?noInts函数写法优化咨询
你的Haskell代码问题解答
1. 要不要用otherwise?
在你的noInts函数里,用otherwise语法上是合法的,但不够精准。因为Ints类型只有两个构造器:NoInts和SomeInts,case表达式里的otherwise其实就是匹配所有非NoInts的情况(也就是SomeInts)。但直接写出具体的构造器匹配会让代码更清晰,可读性更强——别人一看就知道你明确处理了SomeInts的情况,而不是用一个兜底的otherwise。
所以更推荐把case分支写成:
noInts x = case x of NoInts -> True SomeInts _ _ -> False
2. 更优/更具针对性的写法
其实Haskell里可以直接用模式匹配定义函数,不用嵌套case表达式,代码会更简洁直观:
noInts NoInts = True noInts _ = False
这种写法直接把函数定义拆成两个分支,对应Ints的两个构造器,一眼就能看懂逻辑。
如果想更贴合Haskell的惯用写法,甚至可以给Ints实现Foldable实例(因为它本质是一个列表结构),然后复用类似null的逻辑,但对于这个简单场景,上面的模式匹配写法已经足够简洁和清晰了。
3. 怎么理解SomeInts Int Ints?
先看你的类型定义:
data Ints = NoInts | SomeInts Int Ints deriving Show
这是一个代数数据类型,用来模拟整数列表:
NoInts对应普通列表的[](空列表);SomeInts是一个构造器,它的类型签名是Int -> Ints -> Ints——也就是说,它接受两个参数:第一个是Int类型的元素,第二个是Ints类型的“剩余列表”,然后返回一个新的Ints(相当于把这个元素加到剩余列表的前面)。
举个例子,你的ints变量:
ints = SomeInts 1 (SomeInts 2 (SomeInts 3 NoInts))
就等价于普通Haskell列表[1,2,3],只是把(:)换成了SomeInts,把[]换成了NoInts。所以SomeInts Int Ints就是构造器的参数类型声明:第一个参数是单个整数,第二个参数是剩下的整数列表。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

