read
在Prelude中定义为
read :: (Read a) => String -> a
这可以被用作例如read "1" :: Int
。
现在一个函数
readOne :: (Read a) => [String] -> (a, [String])
readOne (x:xs) = (read x,xs)
使用readOne ["1","foo"]
时,会产生错误(如预期):
在约束条件中出现了模糊的类型变量'a':
'Read a' 源于 'readOne' 的使用于 :1:0-18
可能的解决方法: 添加一个类型签名以修复这些类型变量
但是readOne ["1","foo"] :: Int
不能正常工作,而
readOneInt :: [String] -> (Int, [String])
readOneInt = readOne
正常工作:
> readOneInt ["1", "foo"]
(1,["foo"])
那么,我如何在不定义新函数(如
readOneInt
)的情况下为readOne
添加类型签名呢?
:t
询问表达式的类型,您将得到(Num a, Read a) => (a, [String])
,这与之前的问题相同。asTypeOf
可以帮助解决这个问题,例如asTypeOf (readOne ["1", "foo"]) (0::Double,[]::[String])
- 我通常会用反引号中的asTypeOf来编写,但SO不喜欢双重转义的反引号。 - yatima2975