- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个数据类型
data FooBar a = Foo String Char [a]
| Bar String Int [a]
我需要创建这种类型的值并给出空列表作为第二个字段:
Foo "hello" 'a' []
或
Bar "world" 1 []
1)我在代码中的任何地方都这样做,我认为如果我能以某种方式省略空列表部分并隐式分配空列表,那就太好了。这可能吗?类似于其他语言中的默认函数参数。
2) 由于这个 []
“默认”值,我经常需要一个部分构造函数应用程序,该应用程序会生成一个采用前两个值的函数:
mkFoo x y = Foo x y []
mkBar x y = Bar x y []
有没有“更好”(更惯用等)的方法来做到这一点?避免定义新函数?
3)我需要一种将内容添加到列表中的方法:
add (Foo u v xs) x = Foo u v (x:xs)
add (Bar u v xs) x = Bar u v (x:xs)
这是惯用的做法吗?只是一个通用功能?
正如你所见,我是一个初学者,所以这些问题可能没有什么意义。希望不会。
最佳答案
我会一一解答您的问题。
Haskell 中不存在默认参数。它们根本不值得增加复杂性和构图损失。作为一种函数式语言,您在 Haskell 中进行了更多的函数操作,因此像默认参数这样的时髦性将很难处理。
当我开始使用 Haskell 时,我没有意识到的一件事是数据构造函数就像其他所有东西一样都是函数。在您的示例中,
Foo :: String -> Char -> [a] -> FooBar a
因此,您可以编写函数来填充其他函数的各种参数,然后这些函数将与 Foo 或 Bar 等一起使用。
fill1 :: a -> (a -> b) -> b
fill1 a f = f a
--Note that fill1 = flip ($)
fill2 :: b -> (a -> b -> c) -> (a -> c)
--Equivalently, fill2 :: b -> (a -> b -> c) -> a -> c
fill2 b f = \a -> f a b
fill3 :: c -> (a -> b -> c -> d) -> (a -> b -> d)
fill3 c f = \a b -> f a b c
fill3Empty :: (a -> b -> [c] -> d) -> (a -> b -> d)
fill3Empty f = fill3 [] f
--Now, we can write
> fill3Empty Foo x y
Foo x y []
lens包为此类问题提供了优雅的解决方案。不过,一眼就能看出这个包非常复杂。以下是如何调用镜头包的最终结果:
_list :: Lens (FooBar a) (FooBar b) [a] [b]
_list = lens getter setter
where getter (Foo _ _ as) = as
getter (Bar _ _ as) = as
setter (Foo s c _) bs = Foo s c bs
setter (Bar s i _) bs = Bar s i bs
现在我们可以做
> over _list (3:) (Foo "ab" 'c' [2,1])
Foo "ab" 'c' [3,2,1]
一些解释:当给定某种类型的 getter 和 setter 时,lens
函数会生成 Lens
类型。 Lens s t a b
是一种类型,表示“s
持有 a
并且 t
持有 b
” code>。因此,如果你给我一个函数 a -> b
,我就可以给你一个函数 s -> t
”。这正是 over
所做的:你为它提供一个镜头和一个函数(在我们的例子中,(3:)
是一个将 3 添加到 List 前面的函数)并应用“镜头指示的位置”功能。这与仿函数非常相似,但是,我们有更多的自由(在本例中,仿函数实例有义务更改列表的每个元素,而不是对列表本身进行操作)。
请注意,我们的新 _list 镜头非常通用:它在 Foo
和 Bar
上工作得同样好,并且镜头包提供了除 over
之外的许多功能。 code> 用于做神奇的事情。
关于haskell - 具有默认字段且需要与其配合使用的函数的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702318/
自定义限流注解 先介绍一下 @Retention 和 @Target 这两个元注解 @Retention: 指定注解的生命周期(源码、class文件、运行时),其参考值见类的定义:java.lang.
在 Ubuntu 13.10 中使用 PyCharm Community Edition 和 IdeaVim 时,键盘经常停止接受输入,我必须重新启动 IDE。当我单击不同的文本区域时,光标仍然会移动
我正在开发一个Java项目,我试图让useDelimiter删除除“=”和“,”之间的文本之外的所有内容。例如,在文件的第一行我想保留“ThermostatNight”。 文本文件如下所示: E
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
目录 1、加入 remember-me 2、原理分析 自动登录是我们在软件开发时一个非常常见的功能,例如我们登录 QQ 邮箱: 很多网站我们在登录的时
我是开发 Android 应用程序的菜鸟。我想问一下。我的 PreferenceActivity 如何希望在不返回 MainActivity 并再次转到 PreferenceActivity 的情况下
1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开
我正在为命令行应用程序编写一个非常简单的 GUI 工具。它只有 2 个按钮。 连接并退出。 在 applicationDidFinishLaunching 中,我运行以下命令 NSPipe *pipe
我也在 LibGDX forums 上发布了这个问题. 嘿那里!在我的论文中,我正在编写一个 DSL 来描述图片的外观。这些图片将由 libGDX 根据 DSL-Input 绘制。目前,jetbrai
准备 SpringBoot 工程 1.新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestControllerpublic cla
我有类似的问题 this one 以下是我使用的: CDH4.4(配置单元 0.10) protobuf-java-.2.4.1.jar elephant-bird-hive-4.6-SNAPSHOT
我想使用 angularjs 和 angular-ui(特别是 ui-select2 功能)实现对选择输入的读/写访问控制。 场景很简单:通过使用 ng-readonly 属性,我可以控制用户是否可以
我是一名优秀的程序员,十分优秀!