给定Writer
monad动作,我想通过将函数映射到monad动作内的写入数据来修改它.
就像是:
retell :: (w -> w') -> Writer w a -> Writer w' a
Run Code Online (Sandbox Code Playgroud)
这样的函数在库中是否已存在?如果没有,怎么定义?
我正在使用Haskell研究编译器构造.我使用定点数据类型递归来表示抽象语法树(ast).
我正在研究如何为具有简单表达式(数字和逻辑常量,二进制操作和局部变量声明)的玩具语言编写类型检查器.
类型检查器是一个read-write-state(RWS
)monad:
monad返回的值是带有类型(用于表达式)或环境(用于声明)的注释.
该函数checker
接收输入程序的ast并导致使用RWS
monad动作注释的新的ast ,当运行时,给出类型(如果ast是表达式)或环境(如果ast是声明).
例如,考虑输入程序
let x = 2 + 3 in 1 + x
Run Code Online (Sandbox Code Playgroud)
与相应的ast:
Let
|
-----------------------
| |
VarDec: x Bin Add
| |
| ------------
| | |
Bin Add Num 1.0 Var x
|
-----------
| |
Num 2.0 Num 3.0
Run Code Online (Sandbox Code Playgroud)
键入检查将产生以下内容:
action1
Let
|
-----------------------
| |
action2 action3
VarDec: x Bin Add
| |
| ------------
| | |
action4 action5 action6 …
Run Code Online (Sandbox Code Playgroud) 如何在OCaml或SML中表示来自Haskell的以下数据类型?
newtype Fix f = In (f (Fix f))
Run Code Online (Sandbox Code Playgroud) 根据OCaml手册,整数文字可以是负数.例如,-321
是一个有效的整数文字.
该手册还指出根据最长匹配规则解决词汇歧义:当字符序列可以以几种不同方式分解为两个令牌时,保留的分解是具有最长第一令牌的分解.
因此,表达式8-3
应该被分解为两个词法符号8
并-3
导致类型错误,而不是三个词法符号8
,-
并且3
给出二进制操作.但第二种解释是我在顶层评估这个表达式时得到的结果.
我是否遗漏了手册中的内容,或者这个主题是否真的不完整?如果以后,手册可能应该修复.
我想设置特定Gtk+ 3 应用程序使用的字体。如何做呢?
我知道我可以设置文件中所有Gtk+ 3 应用程序使用的字体$XDG_CONFIG_HOME/gtk-3.0/settings.ini
,但我不知道如何仅为特定应用程序设置字体。
编辑:我不开发该应用程序。我只想使用与当前桌面设置不同的字体大小来运行它。