Text.Blaze中的可选html属性

Text.Blaze中的可选html属性,html,haskell,Html,Haskell,文本。Blaze有一个操作员!要向html添加属性,请执行以下操作: option ! id "bla" ! value "1" ! selected "" $ "Hello!" 我的问题是如何使属性成为可选的? 现在我的代码很难看: option ! id "bla" ! value "1" ! (if x == val then selected "" else someStupidAttribute "") $ "Hello!" 这导致每个html选项元素都有不必要的无关属性,因为我

文本。Blaze有一个操作员!要向html添加属性,请执行以下操作:

option ! id "bla" ! value "1" ! selected "" $ "Hello!"
我的问题是如何使属性成为可选的? 现在我的代码很难看:

option ! id "bla" ! value "1" ! (if x == val then selected "" else someStupidAttribute "")  $ "Hello!"
这导致每个html选项元素都有不必要的无关属性,因为我必须提供一个

编辑:我接受了哈马尔的回答。我创建了一个助手函数:

(!?) :: Attributable h => h -> (Bool,Attribute) -> h
html !? (True, attr) = html ! attr
html !? _ = html
下面是如何使用它:

option ! id "bla" ! value "1" !? ((k == val), selected "") $ "Hello!"

我不知道是否有更好的特定于Blaze的方法来实现这一点,我知道这不是非常可读,但你可以做到

(if x == val then (! selected "") else id) (option ! id "bla" ! value "1") $ "Hello!"

如何定义一个便利运算符来有条件地应用属性

(!?) :: Attributable h => h -> Maybe Attribute -> h
html !? (Just attr) = html ! attr
html !? Nothing = html
有了这个,您可以编写如下示例

option ! id "bla" ! value "1" !? toMaybe (x == val) (selected "") $ "Hello!"
在这里,
toMaybe
只是构建
值的一个有用的助手,但如果您愿意,可以使用其他工具

toMaybe :: Bool -> a -> Maybe a
toMaybe False _ = Nothing
toMaybe True  x = Just x

我最喜欢的漂亮条件句技巧是使用列表理解<代码>[foo | x]
将计算为
[foo]
[]
。我们能适应这个技巧吗?使用一个应用属性列表的助手函数:

element !. options = foldr (!) element options -- (!.) = foldr (!)
现在你可以写一些相对漂亮的东西,比如这两个(取决于品味):


您可能需要为
添加固定性声明;你可以使用
:i以查看您试图与之交互操作的内容。

这似乎对我有用-mempty:

import Data.Monoid (mempty)
option ! id "bla" ! value "1" ! (if x == val then selected "" else mempty) $ "Hello!"

谢谢,我喜欢。我的问题是,我是否在文本中遗漏了什么。火焰本身。但是如果我必须定义我自己的助手函数,那么我可以只使用一个接受布尔值和属性的函数。非常感谢你。我比你投了更高的票,但我已经接受了其他答案。
现在已输入。:)
import Data.Monoid (mempty)
option ! id "bla" ! value "1" ! (if x == val then selected "" else mempty) $ "Hello!"