bad*_*ash 2 haskell tail parameter-passing
我写了这个小函数来检索列表的尾部:
let getTail l = if length l > 0 then tail l else "empty list"
Run Code Online (Sandbox Code Playgroud)
传递[]给getTail返回empty list但传递[1,2,3]给出以下错误:
<interactive>:1:14:
No instance for (Num Char)
arising from the literal `3'
Possible fix: add an instance declaration for (Num Char)
In the expression: 3
In the first argument of `getTail', namely `[1, 2, 3]'
In the expression: getTail [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我无法理解那个错误意味着什么.问题是什么?使用GHCi 7.0.4
让我们考虑一下你的getTail功能类型.最初,我们可以想象l成任何列表.但是,返回类型必须是String因为您有时会返回"empty list".由于这是if语句的一部分,你可能也会返回tail l,这意味着l 必须是a String.
所以你的getTail功能有类型String -> String.
当你打电话getTail时[1,2,3],它需要一个String,这只是一个[Char].请记住,数字文字是重载的:[1,2,3]等同于调用[fromInteger 1, fromInteger 2, fromInteger 3].所以,鉴于这个列表,Haskell试图从一个数字中得到一个数字Char.由于Chars不属于Num该类,因此会失败,从而导致错误.
一个好的解决方案是返回一个Maybe类型并给出Nothing错误而不是返回"empty list".所以重写你的功能:
let getTail l = if length l > 0 then Just (tail l) else Nothing
Run Code Online (Sandbox Code Playgroud)
现在它的类型是[a] -> Maybe [a].使用此方法将强制任何使用您的函数的人getTail在能够使用结果之前检查是否成功.
另一种选择是返回[]"空列表".在这种情况下,您的getTail功能将完全像drop 1.