例如,Data.List
中的许多功能都是部分功能,例如(cycle, (!!), init, tail, head, last)
。我当前正在编写一个模块,该模块定义类似于列表的类型,即无限列表。当然,这可以避免某些局部性问题,但不能解决例如cycle
。
我现在面临的困境如下:
是否实施cycle :: [a] -> Maybe (InfList a)
的安全版本,
还是要实现更有用,更不安全,更像base
的函数?
对此有共识吗?
答案 0 :(得分:4)
对此没有一般约定。您可能会同时提供两种版本,以使用户可以选择负责处理域外参数引起的错误的人。
看看list to non-empty list conversion。作者提供了两个构造函数:fromList
假定输入的列表为非空,而nonEmpty
则返回Maybe
。在您的情况下,我将分别命名为fromCycle
和cyclicInfList
以符合该约定。
有时很难确定哪种实现会更准确。在某些情况下,用户可能希望对其进行控制,但有时他会确定论点是正确的,这会导致可憎之物,例如使用fromJust
(粗略)。在我看来,最外交的方法是同时提供两个定义,并将您的难题移交给下一个程序员。