如果我有:
data Data = T | F
deriving (Eq, Show, Ord)
type PhoneBook = [(String, Data)]
testBook :: Book
testBook = [("aT", T), ("bF", F)]
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找功能,但因为我使用的是用户定义的类型,所以它会让我失望.有什么建议?我尝试着:
lookup1 :: PhoneBook->String->Data
lookup1 [] key = Nothing
lookup1 ((k,v):xs) key = if key == k
then Just v
else lookup1 xs key
Run Code Online (Sandbox Code Playgroud)
一旦lookup1函数的类型签名更改为匹配其实际返回类型,问题中的代码将编译(并且可以工作!):
lookup1 :: Book -> String -> Maybe Answer
lookup1 [] key = Nothing
lookup1 ((k,v):xs) key = if key == k
then Just v
else lookup1 xs key
Run Code Online (Sandbox Code Playgroud)
该唯一的变化是返回类型 lookup1 ,也就是现在也许答案,而不是答案.
当你有如下语句type Book = [(String, Answer)]则Book只是一个代名词了[(String, Answer)].这意味着,你可以替换Book使用[(String, Answer)] 在任何地方的类型不改变他们.这意味着在查找一个值Book是完全相同一样仰视的一个值[(String, Answer)].
因此,您可以使用普通lookup函数来获取与特定字符串相对应的答案.