Haskell数据结构查找方法
当我正在构建我的数据结构时,我发现一个问题,我正在解决它时遇到了困难。我的数据结构“structure”是字符串和子结构列表 问题在下面的“lookFor”方法中,即在(结构bxs)中查找名为“a”的子结构并返回它。如果不在“b”的列表(xs)中,它应该继续查找每个xs元素的列表,以此类推。如果找不到,就什么也不做 我的想法是递归,为此,我想到了“MapLookforXS”,以防它没有找到名为“a”的结构 Ghci说“无法将预期的类型结构与实际的类型[结构]匹配” 我理解,因为毕竟map返回的是元素列表,而不是元素Haskell数据结构查找方法,haskell,data-structures,Haskell,Data Structures,当我正在构建我的数据结构时,我发现一个问题,我正在解决它时遇到了困难。我的数据结构“structure”是字符串和子结构列表 问题在下面的“lookFor”方法中,即在(结构bxs)中查找名为“a”的子结构并返回它。如果不在“b”的列表(xs)中,它应该继续查找每个xs元素的列表,以此类推。如果找不到,就什么也不做 我的想法是递归,为此,我想到了“MapLookforXS”,以防它没有找到名为“a”的结构 Ghci说“无法将预期的类型结构与实际的类型[结构]匹配” 我理解,因为毕竟map返回的是
data Structure = Structure String [Structure]
name :: Structure -> String
name (Structure a xs) = a
subStrcts :: Structure -> [String]
subStrcts (Structure a []) = []
subStrcts (Structure a xs) = [name x | x <- xs]
lookFor :: String -> Structure -> Structure
lookFor a (Structure b xs)
| elem (elemIndex a (subStrcts (Structure b xs))) [0..] = xs !! (fromJust (elemIndex a (subStrcts (Structure b xs))))
| otherwise = map (lookFor a) xs
数据结构=结构字符串[结构]
名称::结构->字符串
名称(结构a xs)=a
子字符串::结构->[字符串]
子序列(结构a[])=[]
子序列(结构a x)=[名称x | x结构->结构
查找a(结构b xs)
|elem(elemindexa(subStrcts(结构bxs)))[0..]=xs!!(fromJust(elemindexa(subStrcts(结构bxs)))
|否则=映射(查找a)xs
有什么想法吗?谢谢作为递归结构,您需要设置一个基本情况。在您的示例中,当您用尽列表中的所有结构时,就会发生这种情况 作为@WillemVanOnsem,最好返回一个
Maybe结构
,因为lookFor
函数可能找不到该结构
import Data.List (elemIndex)
import Data.Maybe (fromJust, isJust)
data Structure = Structure String [Structure]
name :: Structure -> String
name (Structure a xs) = a
subStrcts :: Structure -> [String]
subStrcts (Structure a []) = []
subStrcts (Structure a xs) = [name x | x <- xs]
lookFor :: String -> Structure -> Maybe Structure
lookFor a (Structure b xs)
| null xs = Nothing
| isJust maybeIndex = fmap (xs !!) maybeIndex
| otherwise = lookFor a (Structure (name (head xs)) (tail xs))
where maybeIndex = elemIndex a (subStrcts (Structure b xs))
导入数据列表(elemIndex)
导入数据。可能(fromJust,isJust)
数据结构=结构字符串[结构]
名称::结构->字符串
名称(结构a xs)=a
子字符串::结构->[字符串]
子序列(结构a[])=[]
子序列(结构a x)=[名称x | x结构->可能结构
查找a(结构b xs)
|null xs=无
|isJust maybeIndex=fmap(xs!!)maybeIndex
|否则=查找(结构(名称(头xs))(尾xs))
其中,maybeIndex=elemIndex a(子结构(结构b x))
作为递归结构,您需要设置基本大小写。在您的示例中,当您用尽列表中的所有结构时,就会发生这种情况
作为@WillemVanOnsem,最好返回一个Maybe结构
,因为lookFor
函数可能找不到该结构
import Data.List (elemIndex)
import Data.Maybe (fromJust, isJust)
data Structure = Structure String [Structure]
name :: Structure -> String
name (Structure a xs) = a
subStrcts :: Structure -> [String]
subStrcts (Structure a []) = []
subStrcts (Structure a xs) = [name x | x <- xs]
lookFor :: String -> Structure -> Maybe Structure
lookFor a (Structure b xs)
| null xs = Nothing
| isJust maybeIndex = fmap (xs !!) maybeIndex
| otherwise = lookFor a (Structure (name (head xs)) (tail xs))
where maybeIndex = elemIndex a (subStrcts (Structure b xs))
导入数据列表(elemIndex)
导入数据。可能(fromJust,isJust)
数据结构=结构字符串[结构]
名称::结构->字符串
名称(结构a xs)=a
子字符串::结构->[字符串]
子序列(结构a[])=[]
子序列(结构a x)=[名称x | x结构->可能结构
查找a(结构b xs)
|null xs=无
|isJust maybeIndex=fmap(xs!!)maybeIndex
|否则=查找(结构(名称(头xs))(尾xs))
其中,maybeIndex=elemIndex a(子结构(结构b x))
一种可能的解决方案是:
import Control.Applicative
import Data.Foldable
data Structure = Structure String [Structure]
deriving Show
lookFor :: String -> Structure -> Maybe Structure
lookFor a s@(Structure b xs)
| a == b = Just s
| otherwise = asum (map (lookFor a) xs)
上面,map(lookfora)xs
在子结构中搜索a
。这将生成一个[可能的结构]
,我们在其上使用asum
获取第一个值,只取一个
值,这样我们就可以返回它。(如果没有找到这样的值,asum
将返回无任何内容
)
如果您不想利用库中的
asum
,那么定义它是一个不错的初学者练习。一个可能的解决方案是:
import Control.Applicative
import Data.Foldable
data Structure = Structure String [Structure]
deriving Show
lookFor :: String -> Structure -> Maybe Structure
lookFor a s@(Structure b xs)
| a == b = Just s
| otherwise = asum (map (lookFor a) xs)
上面,map(lookfora)xs
在子结构中搜索a
。这将生成一个[可能的结构]
,我们在其上使用asum
获取第一个值,只取一个
值,这样我们就可以返回它。(如果没有找到这样的值,asum
将返回无任何内容
)
如果您不想利用库中的
asum
,定义它是一个很好的初学者练习。不应该lookfore
返回Maybe结构
?此外,广度优先搜索是一项要求,还是任何搜索策略都足够?是的,它应该是广度优先的。您能详细说明Maybe结构吗真的吗?我对这门语言还不熟悉,我还在适应期。对不起,谢谢@WillemVanOnsemwell您不知道是否会找到与查询匹配的结构,对吗?如果找不到,您不能简单地返回null
(Haskell有一个未定义的
,但通常最好不要使用它)。在这种情况下,您可以使用Maybe结构
。aMaybe a
,有两个可能的值Nothing
(即,查询没有给出结果),或者只返回x
和x
结果。对,这肯定是有意义的。但是,我不知道如何在LookForce中实现它:\@WillemVanonSemBourtLookFore
不应该返回可能结构
?此外,广度优先搜索是一项要求,还是任何搜索策略都足够?是的,它应该是广度优先的。你能详细说明一下结构部分吗?我对这门语言还不熟悉,还处于适应期。对不起,谢谢@WillemVanOnsemwell,你不知道是否会找到与查询匹配的结构,对吗?如果找不到,你不能简单地返回null
(Haskell有一个未定义的
,但通常最好不要使用它)。在这种情况下,您可以使用Maybe结构
。aMaybe a
,有两个可能的值Nothing
(即,查询没有给出结果),或者只使用x
和x
作为结果。对,它确实有意义。但是,我不知道如何在lookFor:\@WillemVanOnsem中实现它