【发布时间】:2018-08-22 14:00:15
【问题描述】:
我正在尝试学习purescript。
我在一些 HTML 中有一个按钮,我正在尝试打印其类名。我正在使用pulp 构建和browserifying。
我使用的函数是querySelector:
import Web.DOM.ParentNode (querySelector)
这会返回我想要的项目,Element,在两个“盒子”内:一个外部 Effect monad 和一个嵌入的 Maybe monad:
> :type querySelector
QuerySelector -> ParentNode -> Effect (Maybe Element)
我的 Effect monad 看起来像:
getBtn :: Effect Unit
getBtn = do
doc <- map toParentNode (window >>= document)
button <- querySelector (wrap "#btn") doc
... Need to extract class name from 'button' here
我知道我可以通过在外部 Effect monad 上调用 bind (>>=) 来访问内部 Maybe。我的第一个攻击计划是使用 maybe 功能手动打开 Maybe。以下是对简单 Int 执行此操作的方法:
> maybe 0 (\x -> x) $ Just 7
7
对于一个 Maybe 元素,我认为它看起来像:
unboxMaybeElement :: Maybe Element -> Element
unboxMaybeElement Nothing = Nothing
unboxMaybeElement (Just a) = maybe (Element ..note: trying to create a default element here) (\x -> x) a
一个问题是我找不到 Element 类型的构造函数,所以我无法提供默认值(可能的第一个参数),所以我可以' t 使用此方法。
另外,我找不到 Element 类型的定义。
我还读到,无论如何,进入 Maybe 内部并不是一个好主意,而是通过使用仿函数(如 map 或 fmap)来提升与它相反的函数。
在这种情况下,我尝试调用一个外部函数,例如:
button <- querySelector (wrap "#btn") doc
let cn = getClassName button
log $ "classname=" <> show cn
-- The basic question is how to implement this function?
getClassName :: Maybe HTMLElement -> String
getClassName e = map className (map fromElement e)
注意:className 和 fromElement 在 Web.HTML.HTMLElement 中提供。
如您所见,我试图通过使用地图调用函数来提升函数,因为函数不处理 Maybes,但我陷入了困境“Maybe Element”和“Element”以及“HTMLElement”与“Element”等之间的类型冲突。
是的,我承认我在这里遇到了一些问题,这并不是一个真正的初学者问题,但让我感到厌烦的是,获取 HTML 对象的类名这样简单的事情是如此困难。当然,我一定错过了什么?
顺便说一句,这是我的 html:
<!doctype html>
<html>
<body>
<script src="index.js"></script>
<p>
<input type="button" class="btn-class" value="click me" id="btn"/>
</p>
</body>
</html>
更普遍的问题是:如何获得嵌套两个 monad 级别的值?
【问题讨论】:
-
你试过
fmap,提升一个功能吗?map对列表进行操作。 -
是的,我意识到了这种区别并尝试过,但是对于我的生活,我在 purescript 中找不到任何 fmap 定义?它肯定不在前奏中,或 Data.Functor,或 Data.Maybe。不过,我 确实 在 ghci 中看到了 fmap。 Haskell 和 Purescript 之间存在一些差异,也许这就是其中之一?
-
原谅我,我错过了这是纯粹的。你可以在这里看到:github.com/purescript/purescript-prelude/blob/master/src/Data/… 映射操作在纯脚本中确实被称为
map。className的类型签名是什么?您能否编辑您的帖子以包含您尝试解除该功能时遇到的错误? -
没有明确的想法,但有两个想法: 1.
getClassName :: Maybe HTMLElement -> String看起来很奇怪:如果是Nothing,应该返回什么字符串? 2. 不确定fromElement来自哪里,但我猜它也会返回Maybe?如果是这样,使用此函数映射Maybe将添加另一个Maybe的“层”。听起来您需要>>=或 do-notation。我的一般建议是添加类型签名并使用 typed hole 来查看编译器期望的类型。希望这会有所帮助。
标签: html purescript