Ree*_*Oei 0 haskell functional-programming tuples
我有以下功能:
encode_single :: (Eq a) => [a] -> (Int, a)
encode_single (x:xs) = (count xs + 1, x)
Run Code Online (Sandbox Code Playgroud)
但是,Haskell抱怨需要一个基本案例,但由于泛型a类型,我不知道如何做到这一点.
谢谢!
首先,你收到的只是一个警告,而不是一个错误.Haskell没有需要空单的基本情况,它只是表明它.
部分函数通常是函数式编程中的反模式,因此它只指出了可能出错的部分.您可以通过不同方式避免警告.
第一个是让你的功能安全:如果它不能总是返回一个值,它的返回类型不应该(Int, a),但是Maybe (Int, a),这样你就可以这样做:
encode_single :: (Eq a) => [a] -> Maybe (Int, a)
encode_single [] = Nothing
encode_single (x:xs) = Just (count xs + 1, x)
Run Code Online (Sandbox Code Playgroud)
否则你必须为空案例返回一个有意义的值(只是返回undefined并不比没有定义那种情况好).它可能做somethign就像是适当的:
encode_single [] = (0, undefined)
Run Code Online (Sandbox Code Playgroud)
但是,这假设任何使用结果的代码encode_single都不会在第一个元素为零时评估元组的第二个元素(请注意,如果列表不为空,则第一个元素始终为正,因此0可以用作哨兵值).
这可能是也可能不是.但有一件事是肯定的:这不是编译时安全的,因此在调用这样的函数时可能会收到一些运行时错误.