我发现我真的很喜欢将GADT与Data Kinds结合起来,因为它比以前更能提供类型安全性(对于大多数用途,几乎与Coq,Agda等人一样好).遗憾的是,模式匹配在最简单的示例中失败了,我认为除了类型类之外我无法编写我的函数.
这是一个解释我的悲伤的例子:
data Nat = Z | S Nat deriving Eq
data Le :: Nat -> Nat -> * where
Le_base :: Le a a
Le_S :: Le a b -> Le a (S b)
class ReformOp n m where
reform :: Le (S n) (S m) -> Le n m
instance ReformOp a a where
reform Le_base = Le_base
instance ReformOp a b => ReformOp a (S b) where
reform (Le_S p) = Le_S $ reform p
class …Run Code Online (Sandbox Code Playgroud) 谷歌工作表模式匹配的文档没有帮助.我一直在阅读和搜索一段时间,但找不到这个特殊问题.也许我很难找到正确的搜索条件,但问题是:
我有几个遵循这种格式的数字(部件号):## - ####
类别可以通过部件号定义,即:50-03 ##将是一个产品类别,其余2个数字是特定于模型的.
我一直试图运行这个:
=countif(E9:E13,"50-03[123][012]*")
Run Code Online (Sandbox Code Playgroud)
(E9:e13包含格式化为文本的部件号.如果我以任何其他方式格式化,则值会显示,因为谷歌表认为我正在写日期或尝试算术.)
每次返回0,除非我改为:
=countif(E9:E13,"50-03*")
Run Code Online (Sandbox Code Playgroud)
所以它看起来像通配符,但模式匹配不行?
我想在完成模式匹配之后打印一个字符串列表,以进入这个强大的功能.
如何表达"无所事事但返回单位"的操作?
我的意思是:
let print_nodes nodes =
match nodes with
[] -> (* here i want to noop *)
| s :: t -> print_string s; print_nodes t
Run Code Online (Sandbox Code Playgroud) 这个文件:
object Test extends App {
val obj = List(1,2,3) : Object
val res = obj match {
case Seq(1,2,3) => "first"
case _ => "other"
}
println(res)
}
Run Code Online (Sandbox Code Playgroud)
给出这个警告:
Test.scala:6: warning: non variable type-argument A in type pattern Seq[A]
is unchecked since it is eliminated by erasure
case Seq(1,2,3) => "first"
Run Code Online (Sandbox Code Playgroud)
Scala版本2.9.0.1.
我没有看到如何执行匹配需要擦除类型参数.第一个案例子句是为了询问obj是否是一个3个元素等于1,2和3的Seq.
如果我写了类似的东西,我会理解这个警告:
case strings : Seq[String] => ...
Run Code Online (Sandbox Code Playgroud)
为什么我会收到警告,什么是让它消失的好方法?
顺便说一句,我确实希望与静态类型的Object匹配.在实际代码中,我正在解析类似于Lisp基准的东西 - 它可能是一个字符串,基准序列,符号,数字等.
我需要你的帮助,使用bash/linux格式化一个txt文件.该文件如下所示,它总是有一行名为Rate:Sth然后它以非常特定的格式显示详细信息.我想为每个文件以一个速率拆分文件.在这个例子中,我想要有3个文件,每个文件都有相应的行表示Rate值是什么.
你将如何处理这个问题?
line No. Main Text
1 Rate: GBP
2 12/01/1999,90.5911501,Validated
.....
.....
210 18/01/1999,90.954996,Validated
211 Rate: RMB
212 24/04/2008,132.2542,Validated
.....
1000 25/04/2008,132.2279,Validated
1001 28/04/2008,131.69915,Validated
1002 Rate: USD
1003 21/11/11,-0.004419534,Validated
Run Code Online (Sandbox Code Playgroud) 我正在构建基于循环和模式匹配的不同案例类对象的列表.我想排除(跳过)达到默认情况的项目(基本上过滤列表,并在一个步骤中映射到类型).
我可能对Scala来说太新了,无法看到所有可能性.我的尝试:
val events = for (ev <- data ) yield {
ev.sport match {
case "FOOTBALL" => new FootballEvent(ev)
case "SOCCER" => new SoccerEvent(ev)
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
我之后可以过滤列表,但我怀疑有一些花哨的Scala方式这样做:)
如果您对如何做到最好有任何想法,请告诉我!
我试图了解GHC中视图模式和模式保护之间的关系.模式防护似乎非常直观,而视图模式似乎有点令人困惑.有点看起来模式对于处理模式中的深层事物看起来更好,而模式保护可以更直观地重用视图,但我不太明白.
我有这个通用的值容器:
open System
type Envelope<'a> = {
Id : Guid
ConversationId : Guid
Created : DateTimeOffset
Item : 'a }
Run Code Online (Sandbox Code Playgroud)
我想能够使用模式匹配上Item,同时仍保留包络值.
理想情况下,我希望能够做到这样的事情:
let format x =
match x with
| Envelope (CaseA x) -> // x would be Envelope<RecA>
| Envelope (CaseB x) -> // x would be Envelope<RecB>
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,所以我想知道是否有办法做这样的事情?
更多详情
假设我有这些类型:
type RecA = { Text : string; Number : int }
type RecB = { Text : string; Version : Version } …Run Code Online (Sandbox Code Playgroud) 我设法构建了以下显示我的问题的"最小"示例.
如果启用了PatternSynonyms扩展
data Vec = Vec Int Int
pattern Ve x y = Vec x y
f :: (Vec, Vec) -> Vec
f (v@(Ve a b), Ve c d)
| a > b = Vec c d
| otherwise = v
Run Code Online (Sandbox Code Playgroud)
我得到了f函数的警告
Warning: Pattern match(es) are non-exhaustive
In an equation for `f': Patterns not matched: (_, _)
Run Code Online (Sandbox Code Playgroud)
如果我Ve用Vec它替换每一个都不会抱怨.我的奇异模式同义词如何干扰这里?
下列
(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True
Run Code Online (Sandbox Code Playgroud)
具有所需的短路特性False && undefined ? False.第一个子句在右边的参数中是非严格的,保证在尝试任何其他操作之前进行检查.
显然,如果我改变顺序甚至不发布功能,它仍然有效
both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False
Prelude> both (False, undefined)
False
Run Code Online (Sandbox Code Playgroud)
但这实际上是由标准保证的吗?与条款的顺序不同,模式的评估顺序在这里并不十分清楚.在确定snd元素之前,我是否可以确定匹配(True,False)将在(False,_)确定后立即中止?