我已经挣扎了好几个小时,而且我弄不明白。Haskell自定义数据类型
module Main where
import Data.List
import Data.Function
type Raw = (String, String)
icards = [("the", "le"),("savage", "violent"),("work", "travail"),("wild", "sauvage"),
("chance", "occasion"),("than a", "qu'un"),("expensive.", "cher."),("saves", "en
vaut"),("time", "temps"),("in", "<`a>"), ("worse", "pire"),("{", "{"),("A", "Un"),
("stitch", "point"),("crime;", "crime,"),("a", "une"),("nine.", "cent."),("It's",
"C'est"),("all","tout"),("rare", "rare"),("you", "vous"),("Abandon","Abandonnez"),
("stash", "planquer"),("Everything", "Tout!ce!qui!est"),("who enter.", "qui entrez."),
("Zazie", "Zazie"),("is", "est"),("cat", "chat"),("it's", "c'est"),("raisin", "raisin
sec"),("hope,", "espoir,"),("mistake.", "faute."),("luck", "chance"),("blueberry",
"myrtille"),("I!took", "J'ai pris"),("that", "qui"),("a!chance.", "des risques."),
("drink", "boisson"),("Live", "Vivre"),("regrets.", "regrets."),("stone", "pierre"),
("broke", "a fait d<e'>border"),("without", "sans"),("The!straw", "La goutte d'eau"),
("camel's!back.", "vase.")]
data Entry = Entry {wrd, def :: String, len :: Int, phr :: Bool}
deriving Show
-- English-to-French, hash-table section
entries :: [Entry]
entries = map (\(x, y) -> Entry x y (length x) (' ' `elem` x)) icards
type Run = [Entry]
maxl = maximum [len e | e <- entries]
runs :: [Run]
runs = f 0 $ groupBy ((==) `on` len) $ sortBy (compare `on` len) entries
where f _ [] = []
f i (r @ (Entry {len = l} : _) : rs) | i == l = r : f (i + 1) rs
f i rs = [] : f (i + 1) rs
type Word = String
search' :: Word -> [Entry] -> String
search' searchWord subList
search' _ [] = "unknown"
search' ([def x | x <- subList, (wrd x) == searchWord])==[] = "no match"
search' = [def x | x <- subList, (wrd x) == searchWord]
--search' searchWord subList = (def | x <- subList, (wrd x) == searchWord)
--search' searchWord subList = [def x::String | x <- subList, (wrd x) == searchWord]
--search' searchWord [subList] = [def | x <- subList, (wrd x) == searchWord]
--search' searchWord subList = [def | x <- subList, (wrd x) == searchWord]
--search' searchWord subList = [def x | x <- subList, (wrd x) == searchWord]
--search' searchWord subList = [x->def | x <- subList, (x->wrd) == searchWord]
search :: [Run] -> Word -> String
search runList searchWord = search' searchWord $ runList!!wrdLen
where wrdLen = (length searchWord)
我需要帮助搜索功能。 GHCi会告诉我期望的类型是char ...而实际类型是Entry-> String。
但我希望类型是字符串。我不知道为什么它认为我只想要一个字符。
总的来说这里是我想到: 发送[Run]
和一个词来搜索,其中[Run] = [[Entries]]
和Word = String
的[Run]
应如此格式化的所有条目中[Run]!!0
的是长度为0,[Run]!!1
是长度为1等等。
所以,函数搜索应该检查发送的Word的长度,然后调用search'并发送与列表长度相等的条目列表关联的subList。
一旦进入搜索“我只想对wrd == Word
进行列表的线性搜索,然后返回该单词的def。
任何帮助将是太棒了。
为什么我要他们返回[字符串] ...如果我只想要一个完全匹配?而且,如何在代码中添加没有匹配的条件?我的理解是,一旦Haskell发现第一场比赛,它应该停止正在做的并返回...所以我不认为我需要担心多场比赛? – KevinCameron1337
一次提出一个问题。如果你想要一次完全匹配,你必须自己处理其他案例。使用'case'语句,如'[] - >“当没有匹配时要返回的字符串的大小写匹配”; (匹配:_) - >匹配。 2.如果没有匹配,则不需要添加任何附加代码以返回空列表;它已经做到了。你的理解是不正确的。您可能想在任何您最喜欢的教程中查看列表解析部分。 –
我不知道如何使用'case'语句。我会寻找一些例子。并审查列表解析。 – KevinCameron1337