我正在使用haskell开发词性标记器。为此,我需要创建一个使用单词的函数,然后在由列表列表表示的库中搜索它。所以这是我尝试过的
pos = [["noun","kid","fox"],["adj","quick","brown"],["article","The"]]
search x [] = [(x, "unknown")]
search x (y:ys)
| elem x y == True = (x, head y) : search x ys
| otherwise = search x ys
“ pos”代表图书馆。搜索功能接收一个单词和一个库,并返回一个包含该单词和语音标记部分的元组列表。我的问题是,当我像这样调用函数时:
搜索“儿童” pos
返回:
[(“孩子”,“名词”),(“孩子”,“未知”)]
我知道是由于函数搜索的第一行,当输入为空列表时,它返回单词和unknown
search x [] = [(x,"unknown")]
显示未找到该词。但是,如果我将该部分更改为:
search x [] = []
找不到单词时将没有输出。谁能建议我解决这个问题的方法?
一种简单的解决方案是使用该函数的版本,如果未找到输出,则返回一个空列表,然后使用所需的[(x, "unknown")]
值“替换”一个空输出。如果您在其他地方不需要,甚至可以将main查找功能作为纯本地功能使用:
pos = [["noun","kid","fox"],["adj","quick","brown"],["article","The"]]
search x l = case lookup x l of
[] -> [(x, "unknown")]
o -> o
where
lookup x [] = []
lookup x (y:ys)
| elem x y = (x, head y) : lookup x ys
| otherwise = lookup x ys
((请注意,我已经从== True
防护中删除了elem x y
,这不是必需的,防护需要其条件为布尔表达式,并检查它是否为True
。)