- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法使用 kprintf(或类似的)对异常进行字符串格式化,并且仍然会收到有关冗余参数的警告?到目前为止,我有:
type MyException (s:string) =
inherit System.Exception(s)
static member Raise msg =
Printf.kprintf (fun s -> raise (MyException(s))) msg
do
MyException.Raise "boom %d" 9 1 // Gives NO warning about redundant arguments
failwithf "boom %d" 9 1 // Gives warning about redundant arguments
我知道我可以使用新的 $ 格式,但希望与旧版本的 F# 保持兼容。
最佳答案
问题不是来自kprintf
,而是来自raise
,它允许函数的返回类型可以是任意类型,包括柯里化(Currying)函数。函数 failwithf
有这个警告作为一个特例。
如果你返回,比如说,一个字符串或一个单位,你实际上会得到一个错误。缺点是现在你不能再在每个位置加注,因为返回参数不再是通用的。
您可以通过强制使用类型参数来解决此问题,但这会使调用者不太理想。
例如,这是可行的,但是如果您将 f
的返回类型更改为字符串,则会失败:
open System
type MyException (s:string) =
inherit System.Exception(s)
static member Raise msg =
Printf.kprintf (fun s -> raise (MyException s) |> ignore) msg
module Test =
let f() : unit = // string won’t work
MyException.Raise "boom %d" 9 10 // error, as expected
这里有一些解决方法。您可以使用泛型类型约束来限制类型,并利用 F# 函数类型不可比较或不相等、没有正确值 null
的事实。
由于 F# 强大的结构等式支持,您将使用的大多数类型都是可等式的。类型约束的其他选项是 struct
(仅结构)、null
(这不包括记录和 DU 类型)或特定的继承约束(如果适合您的用例)。
例子:
type MyException (s:string) =
inherit System.Exception(s)
static member Raise<'T when 'T : equality> msg =
let raiser s =
raise (MyException s)
Unchecked.defaultof<'T> // fool the compiler
Printf.kprintf raiser msg
module Test =
let f() = MyException.Raise "boom %d" 9
let g() = MyException.Raise "boom %d" 9 10 // error
除了类型限制之外,缺点是您得到的错误将是类型错误,而不是您请求的警告。
关于F# kprintf : missing warning about about redundant arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73284201/
我有三个数据框: df1: col1 col2 col3 name1 human experID1 name2 mouse experID2 name3 human
对于允许银行/电汇的支付系统,我需要将支付与相应的用户帐户可靠地关联起来。为此,用户应在与其帐户关联的转账中包含引用号。 我想用内置冗余(额外符号)生成这个数字,以便我可以检测和纠正最多 N 个以下(
我的术语可能有误,但有人可以解释为什么我们需要在类中包装 main 方法 吗?这对我来说似乎是多余的。然后你可以再次扩展这个类,完成一个 main 吗? package bears; import b
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
我正在将 Azure 移动服务用于生产移动应用程序。我正在查看 Azure 门户中的故障转移配置,但找不到任何相关信息。 有“流量管理器”,如 Azure documentation 中所述。 。但根
我为我的 Debian 项目创建了一个依赖点图(见图)。依赖关系包括冗余边。我想要一个没有那些冗余边的更简单的图形。我可以自己计算这些,但这并不容易,因为我在 CMakeLists.txt 和 .cm
以下内容已在 OS X 10.11.5 上使用 perl 5.24 进行了测试。 我编写了一个简短的程序 (perl-embed.pl) 来确定 Perl 在将字符串插入反引号时是否转义 shell
我为我的 Debian 项目创建了一个依赖点图(见图)。依赖关系包括冗余边。我想要一个没有那些冗余边的更简单的图形。我可以自己计算这些,但这并不容易,因为我在 CMakeLists.txt 和 .cm
我正在为一个 Web 应用程序项目设计一个数据库,我得出的结论是,我可能有一些查询,需要大量连接表才能进行一次检查。 我想知道将外键存储在某处以减少这些查询所需的联接数量有多糟糕? 举个我现在所拥有的
如果您认为自己有更好的标题,请随意改写标题。 如果你查看 bravo.js 的来源您会在第 807 行注意到以下内容。 module.declare = function main_module_de
我有一个通用函数,它返回 AnyListVM 的子类的新实例,基本上是这样实现的: public TListVM MakeListVM() where TListVM : An
我想了解用于纹理描述的非冗余局部二进制模式。原始LBP和非冗余LBP在纹理描述上有什么区别? 有人可以通过一个很好的例子来阐明上述主题吗? 最佳答案 非冗余局部二进制模式 (NRLBP) 描述符将 L
我正在构建一个数据库,其中包含自行车商店的大量商品。这家自行车店有许多相同的商品,例如 100 个尺寸为 4 且颜色为“红色”的车轮。我的问题是: 是向实体集添加“数量”字段并将所有相似项目放在一个实
这有点吓人。 我认为某处一定有一个设置可以解释为什么会发生这种情况。 在我们的解决方案中,大约有 50 个不同的项目。大多数情况下,这些库以命名空间 OurCompany 开头。 我们有 OurCom
为什么当警告级别处于 2 级或更高级别时,我会立即收到此琐碎代码示例的以下警告? public int Foo(int a) { if (a >= 0) throw new ArgumentE
这是我的代码: example = [1,-4,7,12] positiveSum :: [Int] -> Int positiveSum (x) = 0 positiveSum (x:xs) = r
为什么我在 Perl 中收到此错误“printf 中的冗余参数”?这表示格式字符串需要的值多于包含的值。我提供的格式字符串是否正确? 输入文件: Apollo 13 Ron
我已经习惯了elasticsearch很长一段时间了,但现在我试图找到的解决方案是列出给定搜索字符串的准确值。 我现在用java编写的代码: BoolQueryBuilder queryBuiler
我收到一条编译器警告,提示局部变量“newElement”是多余的。如何更有效地编写以下代码来消除我的代码中的此警告? Element newElement = new Element(left,el
我很好奇编译器如何处理下面的表达式: var collapsed = elements.GroupBy(elm => elm.OrderIdentifier).Select(group =>
我是一名优秀的程序员,十分优秀!