小编Rom*_*ldo的帖子

在Writer monad中更改写入的数据

给定Writermonad动作,我想通过将函数映射到monad动作内的写入数据来修改它.

就像是:

retell :: (w -> w') -> Writer w a -> Writer w' a
Run Code Online (Sandbox Code Playgroud)

这样的函数在库中是否已存在?如果没有,怎么定义?

monads haskell

6
推荐指数
1
解决办法
150
查看次数

共享由monad操作计算的信息

我正在使用Haskell研究编译器构造.我使用定点数据类型递归来表示抽象语法树(ast).

我正在研究如何为具有简单表达式(数字和逻辑常量,二进制操作和局部变量声明)的玩具语言编写类型检查器.

类型检查器是一个read-write-state(RWS)monad:

  • 读者,因为它使用由具有符号定义的环境组成的上下文(符号的关联列表及其类型);
  • writer因为它生成错误消息列表;
  • 稍后将需要状态来实现名义类型等价,现在我只计算程序中定义了多少变量(就像它的使用演示一样).

monad返回的值是带有类型(用于表达式)或环境(用于声明)的注释.

该函数checker接收输入程序的ast并导致使用RWSmonad动作注释的新的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)

compiler-construction monads haskell sharing

5
推荐指数
1
解决办法
253
查看次数

OCaml中的FIx数据类型

如何在OCaml或SML中表示来自Haskell的以下数据类型?

newtype Fix f = In (f (Fix f))
Run Code Online (Sandbox Code Playgroud)

recursion ocaml haskell sml fixpoint-combinators

3
推荐指数
2
解决办法
728
查看次数

OCaml中的扫描和负整数文字

根据OCaml手册,整数文字可以是负数.例如,-321是一个有效的整数文字.

该手册还指出根据最长匹配规则解决词汇歧义:当字符序列可以以几种不同方式分解为两个令牌时,保留的分解是具有最长第一令牌的分解.

因此,表达式8-3应该被分解为两个词法符号8-3导致类型错误,而不是三个词法符号8,-并且3给出二进制操作.但第二种解释是我在顶层评估这个表达式时得到的结果.

我是否遗漏了手册中的内容,或者这个主题是否真的不完整?如果以后,手册可能应该修复.

ocaml operators literals lexical-analysis

1
推荐指数
1
解决办法
148
查看次数

特定 gtk 应用程序的字体设置

我想设置特定Gtk+ 3 应用程序使用的字体。如何做呢?

我知道我可以设置文件中所有Gtk+ 3 应用程序使用的字体$XDG_CONFIG_HOME/gtk-3.0/settings.ini,但我不知道如何仅为特定应用程序设置字体。

编辑:我不开发该应用程序。我只想使用与当前桌面设置不同的字体大小来运行它。

gtk settings fonts gtk3

0
推荐指数
1
解决办法
4347
查看次数