【发布时间】:2021-03-04 03:41:58
【问题描述】:
对于我正在尝试解决的问题,我需要一些帮助。假设我有一个名为 Thing 的类型:
data Thing = ....
我想写一个函数,给定一个字符串,尝试将它与我的状态中的一些东西匹配并返回一个Thing:
findFirstMatch :: String -> State (Maybe Thing)
问题是,要匹配那个字符串,它需要一个可能的字符串列表来匹配它。该列表由为我的状态定义的函数提供:
getPossibilities :: State String
现在,我需要调用第三个函数来接收原始字符串和其中一种可能性,并返回一个Maybe Thing:
tryToMatch :: String -> String -> State (Maybe Thing)
我怎么写findFirstMatch?我想过这样做,但看起来不太干净,感觉可能已经实现了一些东西:
findFirstMatch :: String -> State (Maybe Thing)
findFirstMatch str = do
xs <- getPossibilities
firstNotNull (map (tryToMatch str) xs)
firstNotNull :: [State (Maybe Thing)] -> State (Maybe Thing)
firstNotNull [] = return Nothing
firstNotNull (x:xs) = do
r <- x
case r of
Just _ -> return r
Nothing -> firstNotNull xs
【问题讨论】:
-
你和this person同班吗?
-
大声笑,不,但我看到了相似之处。问题是我没有一个带有列表的单子,而是一个带有元素的单子列表。这就是为什么我不得不写那个丑陋的
firstNotNull东西
标签: haskell