我已经学习Haskell几周了,我对下划线(
两个版本明显非常相似。两者之间的唯一区别在于使用显式变量或下划线。对我来说,
_
)作为函数参数的使用有一个问题。我认为通过具体示例来提问会更好。假设我想定义一个函数,根据提供的索引从列表中提取元素 - 是的,我意识到 (!!)
已经预定义了。我可以定义函数的两种方式如下(我相信还有其他方式):
版本1
indexedElement :: [a] -> Int -> a
indexedElement xs n | n < 0 = error "Index can not be negative."
indexedElement [] n = error "Index must be smaller than the length of the list."
indexedElement (x:xs) 0 = x
indexedElement (x:xs) n = indexedElement xs (n - 1)
版本 2
indexedElement :: [a] -> Int -> a
indexedElement _ n | n < 0 = error "Index can not be negative."
indexedElement [] _ = error "Index must be smaller than the length of the list."
indexedElement (x:_) 0 = x
indexedElement (_:xs) n = indexedElement xs (n - 1)
两个版本明显非常相似。两者之间的唯一区别在于使用显式变量或下划线。对我来说,
_
表示可以写任何东西,而像n
这样的显式变量则更明显地表明参数必须是整数。因此,我更喜欢版本1;但是,(!!)
的GHC源代码却像版本2那样编写。第二个版本有功能上的优势吗?如果没有,那么“纯粹”的Haskell程序员会反对版本1吗?我理解在特定语言中编程时,保持一致的编写代码方式的重要性,所以我尝试遵循“非书面规则”。这是一个例子,我更喜欢第一个版本,但我认为它并不会使代码更难阅读。我不知道这是否与我在纯数学方面的背景有关,但我想听听你们更有经验的Haskell老手怎么看。
_
表示任何值都可以放在那里(只要它是正确的类型,这由类型注释给出)。虽然在未使用时使用n
表示整数可能感觉更自然,但请记住,并非所有人都会有这种偏见。 - bheklilr