如果您确信您的函数的实现是正确的,即它应该将其输入列表中的第一个元素解释为要返回的数字,200
如果没有这样的参数则返回,那么您只需要确保类型签名匹配该实现(它现在不这样做)。
为此,例如,您可以删除类型签名并要求 ghci 推断类型:
$ ghci
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :{
Prelude| let setOffsetTime [] = 200
Prelude| setOffsetTime (x : xs) = read x :: Int
Prelude| :}
Prelude> :t setOffsetTime
setOffsetTime :: [String] -> Int
Prelude> :q
Leaving GHCi.
$
确实,
setOffsetTime :: [String] -> Int
setOffsetTime [] = 200
setOffsetTime (x : xs) = read x :: Int
编译得很好。
如果您想要更通用的类型,可以:: Int
从第二种情况中删除归属。然后上面的方法告诉你可以写
setOffsetTime :: (Num a, Read a) => [String] -> a
setOffsetTime [] = 200
setOffsetTime (x : xs) = read x
从您添加到问题的评论中,我了解到您希望您的函数返回一个浮点数。在这种情况下,你可以写
setOffsetTime :: [String] -> Float
setOffsetTime [] = 200.0
setOffsetTime (x : xs) = read x
或者,更一般地说:
setOffsetTime :: (Fractional a, Read a) => [String] -> a
setOffsetTime [] = 200.0
setOffsetTime (x : xs) = read x