在Vinyl中,我可以为记录定义类型别名,以便更容易导出到其他模块:
import Data.Vinyl
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = ["name" ::: String, "age" ::: Int]
Run Code Online (Sandbox Code Playgroud)
现在假设我添加另一个存储高度的字段.
height = Field :: "height" ::: Int
Run Code Online (Sandbox Code Playgroud)
我想很好地为包含Person
和的记录构造一个类型别名height
.天真,这可能看起来像这样:
type MeasuredPerson = ("height" ::: Int) : Person
Run Code Online (Sandbox Code Playgroud)
显然,这种语法不起作用!有没有办法做到这一点?是否有任何好的参考资料来解释这里似乎使用的类型级数组语法?
在乙烯基库中,有一个RecAll
类型族,让我们要求对类型级别列表中的每个类型使用部分应用的约束.例如,我们可以这样写:
myShowFunc :: RecAll f rs Show => Rec f rs -> String
Run Code Online (Sandbox Code Playgroud)
这一切都很可爱.现在,如果我们的约束RecAll f rs c
在哪里c
是未知的,并且我们知道c x
需要d x
(借用ekmett的contstraints包中的语言),我们怎么能得到RecAll f rs d
?
我问的原因是我正在处理一些需要满足几个类型类约束的函数中的记录.要,我现在用的是做这个:&:
组合子从Control.Constraints.Combine模块中存在的包.(注意:如果安装了其他东西,则不会构建软件包,因为它依赖于超级旧版本contravariant
.您可以复制我提到的一个模块.)有了这个,我可以得到一些非常漂亮的约束,同时最小化类型类肉鸡.例如:
RecAll f rs (TypeableKey :&: FromJSON :&: TypeableVal) => Rec f rs -> Value
Run Code Online (Sandbox Code Playgroud)
但是,在这个函数的主体内部,我调用另一个需要较弱约束的函数.它可能看起来像这样:
RecAll f rs (TypeableKey :&: TypeableVal) => Rec f rs -> Value
Run Code Online (Sandbox Code Playgroud)
GHC无法看到第二个声明来自第一个声明.我认为情况就是这样.我看不到的是如何证明它以实现它并帮助GHC.到目前为止,我有这个:
import Data.Constraint
weakenAnd1 :: ((a …
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种很好的方式来引用值的类型而没有type
在代码中使用显式别名(不是在运行时 - 这里没有进行任何验证).
请使用以下代码(使用Data.Vinyl):
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Vinyl
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = ["name" ::: String, "age" ::: Int]
Run Code Online (Sandbox Code Playgroud)
这里我们有两种类型,"name" ::: String
并"age" ::: Int
在两个地方重复.如果我们在多个记录中重用字段,这可能会变成多个位置.尽管Person
类型实际上是指组成字段,但类型声明是独立的.因此,age
改为代表Float
,需要在各个地方进行改变.
显然,没有必要明确地输入内容,因为它们将被推断出来.但是,在我的情况下,记录类型是从选项解析器返回的,因此导出.同样,可以编写以下内容:
type Name = "name" ::: String
name = Field :: Name
type Age = "age" ::: Int
age = Field :: Age
type Person …
Run Code Online (Sandbox Code Playgroud) 我知道gulp需要一个乙烯基源流才能正常工作,但是有一种简单的方法可以使用已经存在的乙烯基文件或json对象而不是众所周知的仅采用globs的gulp.src吗?
我使用乙烯基 ftp 在远程服务器上部署我的项目。上传文件没问题,但我还想删除本地文件夹中不再存在的文件。
例子 :
本地文件夹
./
fileA
fileB
fileC
Run Code Online (Sandbox Code Playgroud)
远程文件夹:
./
fileB
fileC
fileD
Run Code Online (Sandbox Code Playgroud)
部署后我在远程文件夹中的内容:
./
fileA
fileB
fileC
fileD
Run Code Online (Sandbox Code Playgroud)
我想要什么(与本地文件夹完全相同):
./
fileA
fileB
fileC
Run Code Online (Sandbox Code Playgroud)
我可以使用 rmdir 删除所有文件,但这意味着为每个部署重新上传所有文件。
谢谢
该vinyl-ftp
软件包有一个功能,clean()
但我不知道如何正确使用它.我需要:
build
文件夹中获取所有文件我有以下gulp任务:
gulp.task('deploy', () => {
let conn = ftp.create({host:host,user:user,password: password});
return gulp.src('build/**', {base: './build/', buffer: false })
.pipe(conn.newer('/path/on/my/server/')) // only upload newer files
.pipe(conn.dest('/path/on/my/server/'))
.pipe(conn.clean('build/**', './build/'));
});
Run Code Online (Sandbox Code Playgroud)
1)和2)是可以的,但clean()
功能什么都不做
我构建了一个黑胶唱片的简单例子.首先,一些语言编译指示和导入:
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Vinyl
import Data.Vinyl.Functor
import Control.Applicative
Run Code Online (Sandbox Code Playgroud)
实际示例(为简单起见,它使用HList类型同义词):
mytuple :: HList [Integer,Bool]
mytuple = Identity 4 :& Identity True :& RNil
Run Code Online (Sandbox Code Playgroud)
编译好了.但现在我想使用rtraverse打印黑胶唱片:
printi :: Show a => Identity a -> IO (Identity a)
printi (Identity x) = print x *> pure (Identity x)
main :: IO ()
main = rtraverse printi mytuple *> pure ()
Run Code Online (Sandbox Code Playgroud)
这会出现以下错误:No instance for (Show x) arising from a use of ‘printi’
.我想这是预期的,因为rtraverse …
我有一个方形图像,想将其切成圆形以查看后面的内容(实际上是身体背景图像)。我找到了clip-path
CSS 属性,但我只是用图像创建一个圆圈,而不是创建一个被我的图像包围的圆圈。
到目前为止,我有一个白色背景,所以我只是创建了一个::after
白色元素,带有嵌入的框阴影,但现在我得到了背景图像,所以我无法保留它。
有没有一种带或不带剪辑路径的方法来实现这一目标?
PS:最终的目标是制作一个旋转的音乐黑胶唱片,所以这个中间的孔是必要的!:)
谢谢。
vinyl ×8
haskell ×4
gulp ×3
ftp ×2
node.js ×2
clip-path ×1
constraints ×1
css ×1
geometry ×1
ghc ×1
javascript ×1
node-streams ×1
types ×1
vinyl-ftp ×1