Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中选择列表的标题_Haskell_Xmonad - Fatal编程技术网

在Haskell中选择列表的标题

在Haskell中选择列表的标题,haskell,xmonad,Haskell,Xmonad,现在,我还在学习haskell(配置我的xmonad wm),所以请耐心听我说 我编写了这个函数: doesNameBeginWith :: String -> Query Bool doesNameBeginWith str = fmap ( str `isPrefixOf`) (stringProperty "WM_NAME") 这将根据我的str检查WM_NAME X属性的开头。我可以这样编写它: isMusic = doesNameBeginWith "MPD:" <|

现在,我还在学习haskell(配置我的xmonad wm),所以请耐心听我说

我编写了这个函数:

doesNameBeginWith :: String -> Query Bool
doesNameBeginWith str = fmap ( str `isPrefixOf`) (stringProperty "WM_NAME")  
这将根据我的str检查WM_NAME X属性的开头。我可以这样编写它:

isMusic = doesNameBeginWith "MPD:" <||> doesNameBeginWith "ncmpcpp"
isMusic = doesNameBeginWith ["MPD:", "ncmpcpp"]
doesNameBeginWith :: [String] -> Query Bool
doesNameBeginWith str = foldr1 (<||>) . fmap ( (head str) `isPrefixOf`) (stringProperty "WM_NAME") 
所以我可以这样称呼它:

isMusic = doesNameBeginWith "MPD:" <||> doesNameBeginWith "ncmpcpp"
isMusic = doesNameBeginWith ["MPD:", "ncmpcpp"]
doesNameBeginWith :: [String] -> Query Bool
doesNameBeginWith str = foldr1 (<||>) . fmap ( (head str) `isPrefixOf`) (stringProperty "WM_NAME") 
其想法是使用foldr1来解析字符串列表,但我无法找出sintax来获取列表的标题。。。大概是这样的:

isMusic = doesNameBeginWith "MPD:" <||> doesNameBeginWith "ncmpcpp"
isMusic = doesNameBeginWith ["MPD:", "ncmpcpp"]
doesNameBeginWith :: [String] -> Query Bool
doesNameBeginWith str = foldr1 (<||>) . fmap ( (head str) `isPrefixOf`) (stringProperty "WM_NAME") 
doesNameBeginWith::[String]->查询布尔
doesNameBeginWith str=foldr1()。fmap((head str)`isPrefixOf`)(stringProperty“WM_NAME”)
编辑1:按照建议,我可以组合两个函数来获得我想要的:

doesNameBeginWithL :: [String] -> Query Bool
doesNameBeginWithL = foldr1 (<||>) . map doesNameBeginWith
doesNameBeginWithL::[String]->查询布尔
doesNameBeginWithL=foldr1()。地图是从哪里开始的
但我仍然希望有一个更直接的方法,并了解如何在这种情况下使用列表头


编辑2:再次感谢大家的回答,所有的答案都非常有用!:)

如果你已经有了一个列表,你不需要解析它——你可以简单地解构它

请注意,如果提供的列表中没有两个元素,则此操作将失败

可以说,基于折叠的解决方案更好。正如你所注意到的,这是可以写的

foldr1 (<||>) . map doesNameBeginWith
所以你可以用

foldr1 (<||>) . map (\str -> fmap ( str `isPrefixOf`) (stringProperty "WM_NAME"))
所以


这也可以用
fmap
编写,正如Freerich Raabe所展示的那样。

如果你已经有了一个列表,你不需要解析它——你可以简单地解构它

请注意,如果提供的列表中没有两个元素,则此操作将失败

可以说,基于折叠的解决方案更好。正如你所注意到的,这是可以写的

foldr1 (<||>) . map doesNameBeginWith
所以你可以用

foldr1 (<||>) . map (\str -> fmap ( str `isPrefixOf`) (stringProperty "WM_NAME"))
所以


这也可以用
fmap
编写,正如Freerich Raabe所示。

正如您所意识到的,
head
是获取列表第一个元素的方法,但我要教新手的解决方案是使用模式匹配和递归来访问列表元素。使用您对
doesNameBeginWith的第一个定义:

doesNameBeginAny :: [String] -> Query Bool
doesNameBeginAny (x:xs) = doesNameBeginWith x <||> doesNameBeginAny xs
doesNameBeginAny [] = return False
我使用了
where
来定义一个中间层,使代码更容易理解。我还使用了
foldr
而不是
foldr1
,因此该函数也适用于空列表。同样,您不需要调用
head
,因为
map
fold
负责分解列表


如果您正在寻找一个明确地拆分列表的答案,更像是Python或Java或其他命令式语言中的for-each循环,那就不是您编写Haskell的方式。

正如您所意识到的,
head
是您获取列表第一个元素的方式,但我教新手的解决方案是使用模式匹配和递归来访问列表元素。使用您对
doesNameBeginWith的第一个定义:

doesNameBeginAny :: [String] -> Query Bool
doesNameBeginAny (x:xs) = doesNameBeginWith x <||> doesNameBeginAny xs
doesNameBeginAny [] = return False
我使用了
where
来定义一个中间层,使代码更容易理解。我还使用了
foldr
而不是
foldr1
,因此该函数也适用于空列表。同样,您不需要调用
head
,因为
map
fold
负责分解列表


如果您正在寻找一个明确地拆分列表的答案,更像是Python或Java或其他命令式语言中的for-each循环,那就不是编写Haskell的方式。

您只需要稍微更改映射到string属性的函数;这个功能很方便。而不是

doesNameBeginWith str = fmap ( str `isPrefixOf`) (stringProperty "WM_NAME")  
试一试


您只需要稍微更改正在映射到字符串属性的函数;这个功能很方便。而不是

doesNameBeginWith str = fmap ( str `isPrefixOf`) (stringProperty "WM_NAME")  
试一试


谢谢你的回答,这几乎就是我需要的!:)我一直在寻找一种更直接的方法(同样,我也想学习如何使用列表头),但是结合两个函数,我确实可以获得想要的结果;我将更新我的问题并等待更多的时间来获得其他答案。我确实喜欢lambda,我将使用它来内联函数:)再次感谢您的回答,这几乎就是我需要的!:)我一直在寻找一种更直接的方法(同样,我也想学习如何使用列表头),但是结合两个函数,我确实可以获得想要的结果;我将更新我的问题并等待更多的时间来获得其他答案。我确实喜欢lambda,我将使用它来内联函数:)再次感谢您您可以使用模式匹配,例如
f”“=;f(x:xs)=
以便您可以访问头部
x
。不过,
foldr1
方法看起来要好得多。您可以使用模式匹配,例如
f”“=;f(x:xs)=
以便您可以访问头部
x
。不过,
foldr1
方法看起来要好得多。