如何在haskell中创建一个函数,该函数接受一个单词并从列表列表中搜索它

问题描述 投票:0回答:1

我正在使用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 [] = []

找不到单词时将没有输出。谁能建议我解决这个问题的方法?

list haskell search
1个回答
0
投票

一种简单的解决方案是使用该函数的版本,如果未找到输出,则返回一个空列表,然后使用所需的[(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。)

© www.soinside.com 2019 - 2024. All rights reserved.