【发布时间】:2020-07-30 03:28:23
【问题描述】:
考虑一个类型
data MyBool a = TRUE | FALSE
请注意,MyBool a 并不真正依赖于 a,但我们让它变得如此只是为了好玩。
现在假设我想定义一个函数isParsable :: (Read a) => String -> MyBool a,它决定给定字符串是否可解析为a,并将结果输出为MyBool a。
我自然要写:
isParsable :: (Read a) => String -> MyBool a
isParsable str
| (null parses) = FALSE
| (otherwise) = TRUE
where parses = (reads str)::[(a, String)]
现在这不能编译,但我真的不明白为什么。我不认为这个函数是模棱两可的,因为任何调用isParsable 都必须强制选择a,因此确保满足约束Read a,因为它就在类型签名中。此外,where 子句强制使用reads :: String -> [(a, String)]。但是由于某种原因,GHC 抛出了一个错误。
我在这里误解了什么,有什么方法可以解决这个问题?
【问题讨论】:
标签: haskell types functional-programming