- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试使用指定 eval 函数的 Component 类型类在 Purescript 中开发组件系统。 eval 函数可以由组件的每个子组件递归调用,实质上是获取输入的值。
由于组件可能希望使用运行时值,因此还向 eval 传递了一条记录。我的目标是要求顶级 eval 的 Record 参数中的行包含每个子组件的所有行。对于本身不使用任何行的组件来说,这并不是太困难,但它们的单个子组件确实如此,因为我们可以简单地将子组件行传递给组件。这显示在 evalIncrement
中.
import Prelude ((+), one)
import Data.Symbol (class IsSymbol, SProxy(..))
import Record (get)
import Prim.Row (class Cons, class Union)
class Component a b c | a -> b where
eval :: a -> Record c -> b
data Const a = Const a
instance evalConst :: Component (Const a) a r where
eval (Const v) r = v
data Var (a::Symbol) (b::Type) = Var
instance evalVar ::
( IsSymbol a
, Cons a b r' r) => Component (Var a b) b r where
eval _ r = get (SProxy :: SProxy a) r
data Inc a = Inc a
instance evalInc ::
( Component a Int r
) => Component (Inc a) Int r where
eval (Inc a) r = (eval a r) + one
class Union
时来自
Prim.Row
:
data Add a b = Add a b
instance evalAdd ::
( Component a Int r1
, Component b Int r2
, Union r1 r2 r3
) => Component (Add a b) Int r3 where
eval (Add a b) r = (eval a r) + (eval b r)
No type class instance was found for
Processor.Component a3
Int
r35
while applying a function eval
of type Component t0 t1 t2 => t0 -> { | t2 } -> t1
to argument a
while inferring the type of eval a
in value declaration evalAdd
where a3 is a rigid type variable
r35 is a rigid type variable
t0 is an unknown type
t1 is an unknown type
t2 is an unknown type
evalInc
使用带有空行的虚拟联合的实例会产生类似的错误,如下所示:
instance evalInc :: (Component a Int r, Union r () r1)
=> Component (Increment a) Int r1 where
最佳答案
r ∷ r3
但它被用于 r1
和 r2
是必需的,因此存在类型不匹配。一条记录 {a ∷ A, b ∷ B}
不能在 {a ∷ A}
处给出或 {b ∷ B}
或 {}
是期待。然而,人们可以这样说:
f ∷ ∀ s r. Row.Cons "a" A s r ⇒ Record r → A
f {a} = a
f
是包含标签
"a"
的任何记录上的多态函数带类型
A
.同样,您可以将 eval 更改为:
eval ∷ ∀ s r. Row.Union c s r ⇒ a → Record r → b
eval
在任何至少包含
c
字段的记录上是多态的.这引入了类型歧义,您必须使用代理来解决该歧义。
eval ∷ ∀ proxy s r. Row.Union c s r ⇒ proxy c → a → Record r → b
instance evalAdd ∷
( Component a Int r1
, Component b Int r2
, Union r1 s1 r3
, Union r2 s2 r3
) => Component (Add a b) Int r3 where
eval _ (Add a b) r = eval (RProxy ∷ RProxy r1) a r + eval (RProxy ∷ RProxy r2) b r
r1
和
r2
变得模棱两可,因为它们不是由
r3
确定的独自的。在给定的约束下,
s1
和
s2
也必须知道。您可能会添加一个功能依赖项。我不确定什么是合适的,因为我不确定您正在设计的程序的目标是什么。
关于typeclass - Purescript 行联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422462/
来自 F# 世界,我习惯使用 |>将数据通过管道传输到函数中: [1..10] |> List.filter (fun n -> n % 2 = 0) |> List.map (fun n -> n
是否可以对 Purescript 中的类型构造函数施加某些限制?例如: newtype Name = Name String -- where length of String is > 5 最
我刚刚开始学习 Purescript,所以我希望这不是一个愚蠢的问题。 假设我们有一个对象 a = {x:1,y:2} 我们想要将 x 更改为等于 2。据我所知,如果我们使用 ST monad,我们将
我想知道如何在 PureScript 代码中添加注释。 在 Python 中,等价的是: # Here is a comment 或JavaScript // Another comment Pure
当在缩进位置使用三引号时,我肯定也会在输出 js 字符串中缩进: 在嵌套的 let 中比较这两个 let input1 = "T1\nX55.555Y-44.444\nX52.324Y-40.386"
PureScript by Example,在 The Eff Monad -> Handlers and Actions 部分指出“[效果]处理程序通常从集合中减去效果”。但是,这些示例相当不透明,
纯脚本列表中是否有 foreach 方法? foreach 方法获取列表的每一项并返回一个单位。 它是打印列表中每个项目的好方法。 编辑:我正在尝试下面建议的 traverse 方法,但出现错误 im
我首先是关于 Purescript 的。 我要将新字段添加到 Object 并将其作为函数参数发送。 但我找不到一个好的解决方案。 例如。 oldFiled = { title : "title",
我正在使用 Purescript 做第一步并复制 "hello world" app . 测试通过。我故意破坏了测试。 module Test.Main where import Prelude im
我是 Purescript 的新手,所以这可能是一个幼稚的问题。 我想编写一个 Purescript 函数,它从浏览器上的 HTML 输入元素读取输入,并将一些输出写入另一个 HTML 输入元素。 使
我想制作一个非常人性化的开发环境,我正在考虑使用 PureScript 来提供语言部分。我看到开箱即用,Show不适用于作为 Show 实例的事物的记录: log (show {a:5}) “试试 P
有没有办法做类似的事情 first = {x:0} second = {x:1,y:1} both = [first, second] 使得 both推断为 {x::Int | r}或类似的东西? 我
我正在使用 purescript-halogen,当捕获到子组件的消息时,我想滚动到 div 的底部。 但是,在 Halogen 中似乎不存在滚动 Action 控制。 那么,我该如何 Scroll
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
大家。我想在 Purescript 的记录数组中找到一个元素,但由于我不熟悉 Purescripot,所以无法解决。 我有一个包含银行记录的数组banks。 这是银行记录的类型。 type Bank
我有一个类型为 Either String (Either String Int) 的对象.我想将其折叠为 Either String Int 类型的对象. PureScript 中是否有为此提供的函
我想使用 Purescript 的 Halogen 编写前端的特定组件。 例如,我想使用卤素创建一个注册表单。它看起来像下面这样: module RegistrationForm where impo
这对我来说似乎是一个奇怪的问题,但我已经通过了 purescript-datetime和 purescript-js-date而我就是找不到获取当前信息的方法 DateTime .是否有一些隐藏的库函
当目标平台是 JavaScript 时,我正在寻找一种控制 Purescript 代码翻译格式的方法。 “spago bundle-app”为 ES5 版本生成 JavaScript 代码。 spag
我正在使用 purescript-halogen 构建类似电子表格的表格(类似于 Handsontable )。如果您双击一个单元格,一个 html 输入元素将呈现为相应表格单元格的子元素(并且不会为
我是一名优秀的程序员,十分优秀!