小编sin*_*ity的帖子

如何有条件地绑定在do块中?

我想在do块中实现以下目标:

do 
  if condition then
    n0 <- expr0
  else
    n0 <- expr0'
  n1 <- expr1
  n2 <- expr2
  return T n0 n1 n2
Run Code Online (Sandbox Code Playgroud)

但是Haskell会给出一个编译错误,除非我这样做:

do 
  if condition then
    n0 <- expr0
    n1 <- expr1
    n2 <- expr2
    return T n0 n1 n2  
  else
    n0 <- expr0'
    n1 <- expr1
    n2 <- expr2
    return T n0 n1 n2 
Run Code Online (Sandbox Code Playgroud)

它看起来很冗长,尤其是当有许多共享的绑定表达式时。如何使其更简洁?

实际上,我正在尝试执行以下操作:

do 
  if isJust maybeVar then
    n0 <- f (fromJust maybeVar)
    n1 <- expr1
    n2 <- expr2
    return (T (Just n0) n1 …
Run Code Online (Sandbox Code Playgroud)

monads haskell bind conditional-statements do-notation

7
推荐指数
2
解决办法
165
查看次数

如何使用Parsec解析三元表达式?

buildExpressionParser仅处理一元和二进制运算符。它可以处理像这样的三元运算符?:吗?这里这里都有一些讨论,但没有一个是结论性的。

haskell parsec megaparsec

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

整数第n个根

如果x'是最大整数,则x'是y的第n个根,使得x ^ n <= y.x,x'和y都是整数.有没有有效的方法来计算这样的第n个根?我知道这通常是由第n个根算法完成的,但这里的难点是一切都是整数,因为我正在使用嵌入式系统.

顺便说一句,我甚至尝试从1到y进行二进制搜索以识别最大x,使得x ^ n <= y,但由于x ^ n容易溢出,尤其是当n很大时,它不起作用.

algorithm math nth-root

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

GitHub Actions 可以从私有存储库创建到公共存储库的发布吗?

我想创建一个包含可供用户下载的资源的版本。由于它是一个私人存储库,因此我想在单独的公共存储库中创建该版本。这在 GitHub Actions 中可行吗?

create-release操作中有ownerrepo参数,但将它们设置为不同的存储库后我不断收到错误:

   - name: Create Release
     id: create_release
     uses: actions/create-release@v1
     env:
       GITHUB_TOKEN: ${{ secrets.PAT }} # A personal access token
     with:
       tag_name: ${{ github.ref }}
       release_name: Release ${{ github.ref }}
       draft: false
       prerelease: false
       owner: foo
       repo: another_public_repo
Run Code Online (Sandbox Code Playgroud)

错误:验证失败:{"resource":"Release","code":"custom","field":"tag_name","message":"tag_name 不是有效标签"}, {"resource":" Release","code":"custom","message":"发布的版本必须具有有效的标签"}, {"resource":"Release","code":"invalid","field":"target_commitish" }

github-actions

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

如何使用 megaparsec 获取 AST 节点的源范围?

我正在尝试为我正在解析的某些源文件生成源映射,并且我想获取每个节点的范围。getSourcePos仅给出节点的起始位置(src:line:column)。如何获得其结束位置?

haskell megaparsec

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

如何使用megaparsec报告多个错误?

根据 megaparsec 文档,“自第 8 版以来,一次报告多个解析错误变得更加容易。” 我一直无法找到一个这样做的例子。我找到的唯一一个就是这个。然而,它只展示了如何解析换行符分隔的玩具语言,也没有展示如何将多个错误组合到 ParseErrorBundle 中。这个SO 讨论不是结论性的。

parsing haskell megaparsec

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

QuickCheck 中的“尺寸”参数到底是什么?

在quickcheck中的许多函数中都会用到size参数。但我很难理解它到底是什么。getSize返回什么?

haskell quickcheck

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

将字符串映射到 Haskell 中的数据类型

我有以下类型:

data Color = Red
           | Yellow
           | Green
           | ...
Run Code Online (Sandbox Code Playgroud)

我想要一个将字符串表示映射到特定颜色的函数。

str2Color :: String -> Color

str2Color "Red": Red
str2Color "Yellow": Yellow
str2Color "Green": Green
Run Code Online (Sandbox Code Playgroud)

我可以枚举所有字符串,但问题是所有颜色的列表很长。有没有更简单的方法?

ps:为了便于说明,我们假设所有输入字符串都有相应的颜色。

haskell

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

如何在编译器中实现源映射?

我正在 Haskell 中实现一个编译器,将源语言编译为目标语言(类似汇编)。

出于调试目的,需要源映射将目标语言汇编指令映射到其相应的源位置(行和列)。

我已经广泛搜索了编译器实现,但没有一个包含源映射。

谁能指出我如何生成源地图的正确方向?

代码示例、书籍等。Haskell 优先,其他语言也欢迎。

compiler-construction haskell source-maps

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

如何解析无序语法

newtype Program = Program [Global] [Function]
Run Code Online (Sandbox Code Playgroud)

我正在 Haskell 中使用类 C 语法解析源文件,其中全局变量和函数位于顶层。如果它们必须按顺序出现,例如,在所有全局变量之后的函数,解析起来很简单。但它们可以按任何顺序出现,如下所示。如何处理这样的语法?

全球0

函数0

全球1

功能1

功能2

全球2

似乎可以使用 Parsec.Perm 之类的东西,但是当所有选择返回相同类型(十进制)时,该示例有效,而我的情况则返回GlobalFunction

haskell parsec

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