【问题标题】:How to create a function in haskell that takes a word and search it from a list of lists如何在haskell中创建一个函数,该函数接受一个单词并从列表列表中搜索它
【发布时间】:2019-12-11 09:23:50
【问题描述】:

我正在使用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”代表图书馆。 搜索函数获取一个单词和库,并返回一个包含单词和词性标记的元组列表。 我的问题是当我这样调用函数时:

搜索“孩子”的位置

它返回:

[(“孩子”,“名词”),(“孩子”,“未知”)]

我知道这是因为函数搜索中的第一行,当输入为空列表时,它会返回单词和未知数

search x [] = [(x,"unknown")]

显示未找到该词。但是,如果我将该部分更改为:

search x [] = []

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

【问题讨论】:

    标签: list haskell search


    【解决方案1】:

    对此的一个简单解决方案是使用函数版本,如果未找到输出,则返回空列表,然后将空输出“替换”为所需的 [(x, "unknown")] 值。如果您在其他地方不需要它,您甚至可以将主查找函数作为纯本地函数:

    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
    

    (请注意,我已经从 elem x y 守卫中删除了 == True,这不是必需的,守卫需要其条件为布尔表达式并检查它是否为 True。)

    【讨论】:

      【解决方案2】:

      您可以添加一个额外的参数,以防找不到返回的“tail”,例如:

      search :: Eq a => a -> [[a]] -> [(a, a)]
      search x = go [(x, "Unknown")]
          where go t [] = t
                go t (y:ys) | elem x ys = (x, head y) : go [] ys
                            | otherwise = go t ys
      

      话虽如此,我不相信您的 search 函数的设计方式正确。

      可能会更好:

      1. 使用[(a, [b])] 作为“数据库”,因此是一个二元组列表,其中a 是“标签”,b 是标签应用的“值”,并且
      2. 您可能只想返回空列表[],以防它找不到元素,因为标签“未知”可能也是数据库的一部分。

      然后我们可以用:

      search :: Eq a => a -> [(b, [a])] -> [(a, b)]
      search x = go
          where go [] = []
                go ([]:ys) = go ys
                go ((t:vs):ys) | elem x vs = (x, t) : go ys
                               | otherwise = go ys
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多