部分应用Haskell中的几个函数

2023-12-02

假设,在 Haskell 中,我有一堆函数,它们都依赖于相同的参数类型:

f :: Par -> a -> b
g :: Par -> b -> c

当我编写更多仍然依赖于此参数类型的函数时,我可以执行类似的操作

h :: Par -> a -> c
h par = myg . myf
    where myf = f par
          myg = g par

然而我还是不得不写这些where线。问题是:这种情况可以避免吗?

[编辑:我试图提供一个最小的示例来说明问题,但显然这个示例太小而无法说明我想要的内容。实际问题中h当然不仅仅是f和g的复合。所以这里是一些实际的代码:

有功能

apply :: ChamberLattice -> ChLatword -> ChLatWord
reduce :: ChamberLattice -> ChLatWord -> ChLatWord

我正在定义一个函数

chaseTurn :: ChamberLattice -> Turn -> Parity -> ChLatWord -> ChLatWord
chaseTurn cl Straight _ xs = xs
chaseTurn cl t parity xs = if ((turn parity xs) == t)
                           then case myApply xs of
                               (y1:y2:ys) -> (y1:y2:(myChaseTurn t parity ys))
                               ys -> ys
                           else myReduce xs
where myApply = apply cl
      myChaseTurn = chaseTurn cl
      myReduce = reduce cl

]

(这个问题本质上与Haskell 中的分组函数但我在那里使用了一些不幸的词语,分散了人们的注意力。)


在 Haskell 中,所有函数都采用一个输入参数。但有时,应用函数的返回值是一个新函数。那么,第一步,您可以通过将函数的返回值放在括号中来使其更加明确f and g:

f :: Par -> (a -> b)
g :: Par -> (b -> c)

函数也是类型,所以我们可以任意决定别名a -> b to φ (phi代替f) and b -> c to γ (gamma代替g)。 (是的,当你用完字母时,你就可以使用希腊字母!)

这意味着您可以将您的函数视为具有以下类型

f :: Par -> φ
g :: Par -> γ

这些都是所谓的自动实例读者单子,这也是一个(应用)函子。特别,(->) Par,或者,如果有帮助的话,Par ->, is an Applicative实例。这意味着您可以使用pure and <*>用它。

作为第一次尝试,您可以写类似的内容

pure (\x y -> (x, y)) <*> f <*> g

为了简单地理解该组合物是如何工作的。该表达式的类型为Par -> (φ, γ), 可以这么说。该 lambda 表达式只需x来自f“容器”,以及y来自g'容器',并将它们组合在一个元组中。元组的第一个元素的类型为φ,第二个元素的类型为γ.

代入定义φ and γ,你得到类型Par -> (a -> b, b -> c).

您想要组合这些函数,而不是作为函数元组的返回值。您可以使用函数组合运算符.为了那个原因:

h = pure (\x y -> y . x) <*> f <*> g

请注意,函数是从右到左组成的,因此x (a -> b) 首先出现,然后是y (b -> c).

但是,您可以翻转f and g around:

h = pure (\y x -> y . x) <*> g <*> f

然后,该显式 lambda 表达式可以被 eta 简化为:

h = pure (.) <*> g <*> f

最后,而不是写pure (.) <*>你可以使用中缀<$>操作员:

h = (.) <$> g <*> f

该函数的类型为Par -> a -> c.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部分应用Haskell中的几个函数 的相关文章

  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何在gcc中打印UINT64_t?

    为什么这段代码不起作用 include
  • 如何使用 jQuery 在第二次单击时反转 CSS 动画

    我制作了以下菜单图标 CSS 动画 当我点击它时会触发它 当我使用 jQuery 第二次单击它时 我想使其反向动画 path1 stroke dasharray 33px stroke dashoffset 33px animation l
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 带有 UnboundLocalError 的本地和全局引用

    我不太明白为什么代码 def f print s s foo f 运行得很好但是 def f print s s bar s foo f 给我 UnboundLocalError 我知道我可以通过声明来解决这个问题s作为函数内的全局变量或简
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • 在 JavaScript 函数中加载图像

    我有获取图像像素颜色的功能 function getImage imgsrc var img img src imgsrc var imageMap new Object img load function var canvas
  • 自调用函数未定义

    如果我声明一个函数文字 var x function alert hi console log x returns the function code However var x function alert hi console log
  • 如何创建不返回任何内容的函数

    我想写一个函数pl pgsql 我在用着Postgres 企业管理器 v3并使用 shell 来创建一个函数 但在 shell 中我必须定义返回类型 如果我不定义返回类型 我将无法创建函数 如何创建一个不返回结果的函数 即创建一个新表的函数

随机推荐

  • 符号工具箱从符号名称中删除最后的“点”

    我遇到了八度符号工具箱的奇怪行为 其中符号变量以结尾 dot输掉决赛dot suffix pkg load symbolic clear clc syms xxxdot syms Symbolic variables in current
  • Windows7 Batch,如何在第一个For循环后中断

    我正在编写一个简单的脚本来检索以 IP 形式给出的本地主机地址 为了获取我的 IPv4 地址 Win7 我编写了简单的 FOR 循环 但结果我从最后一个循环代替第一 这是批处理代码 cls for f tokens 1 2 delims a
  • Plotly:如何使用plotly和plotlyexpress绘制回归线?

    我有一个数据框 df 其中包含 pm1 和 pm25 列 我想用一张图表 用 Plotly 显示这两个信号的相关程度 到目前为止 我已经成功地显示了散点图 但我无法绘制信号之间相关性的拟合线 到目前为止 我已经尝试过 denominator
  • 在Linux中使用命令行将xlsx转换为csv

    我正在寻找一种在 Linux 上将 xlsx 文件转换为 csv 文件的方法 我不想使用 PHP Perl 或类似的东西 因为我正在考虑处理数百万行 所以我需要快速的东西 我在 Ubuntu 存储库上找到了一个名为 xls2csv 的程序
  • Git 大文件存储背后的存储机制是什么?

    Github最近推出了一个扩大git 以不同的方式存储大文件 他们到底是什么意思扩展用 Git 内的文本指针替换大文件 您可以在git lfs 源 how a 文本指针 被定义 type Pointer struct Version str
  • QTableView 中只有复选框的列

    我在 Sqlite 数据库中有一个表 我使用 QTableview 和 QSqlQueryModel 显示该表 第一列需要有一个标题 它是一个复选框 并且该列中的所有项目也需要是复选框 我已将第一个列标题实现为复选框 并且效果很好 由于列中
  • WCF 4 REST 服务的正确配置是什么?

    很抱歉发布这个消息 但这让我发疯 我在 VS2010 中的 WCF4 REST 模板中使用路由 我将 maxreceivedmessagesize 属性设置为某个巨大的数字 当我尝试向服务提交 xml 时 它仍然给出 HTTP 状态代码 4
  • 通过 BouncyCastle 进行 CSR 签名生成的证书被视为不受信任

    我正在努力解决以下问题 我有一个 CSR 我使用此代码签署 Override public X509Certificate signCSR Reader pemcsr int validityDays throws APIException
  • 如何知道用户是否已经喜欢 Facebook Likebox 中的页面?

    我需要找到一种方法来了解读者是否已经喜欢我的页面 Facebook API 中有没有方法可以知道这一点 点赞按钮可以为您处理这个问题 它会根据用户是否已经喜欢该页面来自动切换按钮的状态 如果您在使用 喜欢 按钮之外需要此功能 那么如果您的页
  • Linux 命令行使用 for 循环并格式化结果

    如何使用一个命令行提供特定大小之间的所有文件的列表 然后使用名称 md5 和文件大小格式化文件 示例输出应该是 file1 MD5 value size file2 MD5 value size etc 我尝试了以下方法 但它在单独的行上显
  • 在java中使用jackson反序列化日期字段时抛出自定义异常

    DTO Getter Setter ToString public class TestDto NotNull private String id NotNull DateTimeFormat pattern YYYY MM DD T hh
  • Git 中的 Sign Off 功能有什么用?

    有什么意义Git 中的签核功能 git commit signoff 如果需要的话 我应该什么时候使用它 签核是将补丁添加到 Linux 内核和其他一些项目中的必要条件 但大多数项目实际上并不使用它 它是在上合组织诉讼 and SCO 的其
  • 在 swift 中将双精度值四舍五入到 x 位小数

    谁能告诉我如何在 Swift 中将双精度值四舍五入到 x 位小数 I have var totalWorkTimeInHours totalWorkTime 60 60 With totalWorkTime是秒内的 NSTimeInterv
  • PHP IDE,用于在远程文件中搜索而不将文件存储到本地[关闭]

    Closed 这个问题是无关 目前不接受答案 是否有任何好的 IDE 可以从远程文件中搜索单词或短语 而无需先存储 同步到本地计算机 我尝试过Aptana 但它似乎无法做到这一点 但是远程文件系统很好 不存储到本地 我尝试过 Netbean
  • 将没有“timevar”的数据帧从长格式转置/重塑为宽格式

    我有一个遵循以下长模式的数据框 Name MedName Name1 atenolol 25mg Name1 aspirin 81mg Name1 sildenafil 100mg Name2 atenolol 50mg Name2 ena
  • Azure AD 允许匿名

    是否可以使用AllowAnonymousWindows Azure AD 的属性 我需要我的 Web api 的一部分是匿名的 但不是实际的网站 有任何想法吗 Azure AD 不需要支持匿名身份验证即可在 WebAPI 中使用 Allow
  • EF Core LINQ 从包含的实体中排除列

    我将 ASP Net Core 2 0 与实体框架结合使用 并尝试将模型返回到包含就业实体的页面 其中还包括就业文档实体的集合 对于后者 我不想加载数据 byte 列 但我确实想要所有其他列 最重要的是 FileName 我加载所有内容 包
  • Ruby:如果数组 A 中不存在数组 B 中的项,如何从数组 A 中删除该项?

    我已经准备好了这两个数组 list of students Student where class param given class list of teachers Teacher where Student属于Teacher and
  • 文件上传到 AppEngine Blobstore

    按照此blob存储文档关于如何上传到 Blobstore 它展示了通过JSP Servlet的方式上传 由于我的应用程序基于 GWT 因此我需要将其改编为 GWT RPC 而不是 JSP 所以在我的应用程序 RPC 服务实现中 public
  • 部分应用Haskell中的几个函数

    假设 在 Haskell 中 我有一堆函数 它们都依赖于相同的参数类型 f Par gt a gt b g Par gt b gt c 当我编写更多仍然依赖于此参数类型的函数时 我可以执行类似的操作 h Par gt a gt c h pa