Haskell数据结构查找方法

Haskell数据结构查找方法,haskell,data-structures,Haskell,Data Structures,当我正在构建我的数据结构时,我发现一个问题,我正在解决它时遇到了困难。我的数据结构“structure”是字符串和子结构列表 问题在下面的“lookFor”方法中,即在(结构bxs)中查找名为“a”的子结构并返回它。如果不在“b”的列表(xs)中,它应该继续查找每个xs元素的列表,以此类推。如果找不到,就什么也不做 我的想法是递归,为此,我想到了“MapLookforXS”,以防它没有找到名为“a”的结构 Ghci说“无法将预期的类型结构与实际的类型[结构]匹配” 我理解,因为毕竟map返回的是

当我正在构建我的数据结构时,我发现一个问题,我正在解决它时遇到了困难。我的数据结构“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结构
。a
Maybe a
,有两个可能的值
Nothing
(即,查询没有给出结果),或者
只返回x
x
结果。对,这肯定是有意义的。但是,我不知道如何在LookForce中实现它:\@WillemVanonSemBourt
LookFore
不应该返回
可能结构
?此外,广度优先搜索是一项要求,还是任何搜索策略都足够?是的,它应该是广度优先的。你能详细说明一下结构部分吗?我对这门语言还不熟悉,还处于适应期。对不起,谢谢@WillemVanOnsemwell,你不知道是否会找到与查询匹配的
结构,对吗?如果找不到,你不能简单地返回
null
(Haskell有一个
未定义的
,但通常最好不要使用它)。在这种情况下,您可以使用
Maybe结构
。a
Maybe a
,有两个可能的值
Nothing
(即,查询没有给出结果),或者只使用x
x
作为结果。对,它确实有意义。但是,我不知道如何在lookFor:\@WillemVanOnsem中实现它