我正在尝试以递归方式打印出所有对象属性和子类型属性等.我的对象模型如下...
type suggestedFooWidget = {
value: float ;
hasIncreasedSinceLastPeriod: bool ;
}
type firmIdentifier = {
firmId: int ;
firmName: string ;
}
type authorIdentifier = {
authorId: int ;
authorName: string ;
firm: firmIdentifier ;
}
type denormalizedSuggestedFooWidgets = {
id: int ;
ticker: string ;
direction: string ;
author: authorIdentifier ;
totalAbsoluteWidget: suggestedFooWidget ;
totalSectorWidget: suggestedFooWidget ;
totalExchangeWidget: suggestedFooWidget ;
todaysAbsoluteWidget: suggestedFooWidget ;
msdAbsoluteWidget: suggestedFooWidget ;
msdSectorWidget: suggestedFooWidget ;
msdExchangeWidget: suggestedFooWidget ;
}
Run Code Online (Sandbox Code Playgroud)
我的递归基于以下模式匹配...
let rec printObj (o …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个可以警告特定不完整模式的pragma.它会使编译器失败,并带有以下(假设的)代码:
{-# FAILIF incomplete-patterns #-}
f :: Int -> Int
f 0 = 0
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Arrows编写"编译器",并且知道模式匹配已完成将有助于隔离错误.谢谢!
抱歉标题,我无法想出一个干净的方式来问我的问题.
在Python中我想匹配一个表达式'c [some stuff] t',其中[some stuff]可以是任意数量的连续a,b或c并且以任何顺序.
例如,这些工作: 'ct','cat','cbbt','caaabbct','cbbccaat'
但这些不是: 'cbcbbaat','caaccbabbt'
编辑:a,b和c只是一个例子,但我真的希望能够将它扩展到更多的字母.我对正则表达式和非正则表达式解决方案感兴趣.
我基本上希望匹配不包含此字符串"Hello"的每一行
例:
sdfsdoifdoskf
fdgokfdghodfkg
hello
fdojgohdfgjkdfg
gfobjobhkdfokgdfg
dofjkdsf hello dfgkdfogdfg
xcvmxhckvmxck
fogkdfhokg
hello
Run Code Online (Sandbox Code Playgroud)
我尝试了这个正则表达式模式: ^((?!hello).)*$
找不到匹配项.
基本上我想使用notepad ++ 删除不包含字符串"hello"的每一行
本教程展示了一些非常基本的模式匹配示例,例如匹配整数以模拟c风格的switch语句.本教程还演示了如何对元组类型和解构结构进行基本的解构.
看起来应该可以在矢量上进行模式匹配,但是我无法找到它的正确语法,我还没有找到它的任何例子.
例如,在Haskell中,您可以轻松地对列表进行构造:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr func initValue [] = initValue
foldr func initValue (x:xs) = func initValue $ foldr initValue func xs
Run Code Online (Sandbox Code Playgroud)
所以,看一个粗略的翻译,能够这样做会很高兴:
fn foldr<A, B>(func: fn(A, B) -> B,
initValue: B,
vals: [A]) -> B {
alt vals {
[] { ret initValue; }
_ {
let h = vec::head(vals),
t = vec::tail(vals);
ret foldr(func, func(initValue, h), t);
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道你可以在这里使用if语句,我只是将它作为矢量模式匹配的一个例子.
目前返回:
patterns.rs:10:4: 10:5 …Run Code Online (Sandbox Code Playgroud) 我试图匹配下面的行不输入NOT包含"VelSign"(使用Notepad ++):
#MARKER VelSign 457.45 50 kmh
#MARKER IsBridge是真的
#MARKER TrafficSign 45
#MARKER TrafficLight 45 445 444 40
我使用以下正则表达式:
^#MARKER (?!.*VelSign).*$
似乎没有用.我究竟做错了什么?
是否有可能创建一个泛型函数,将Foo或Bar作为参数,并返回一个在模式匹配中使用该参数的函数?
例如,如果我有
isFoo :: SomeData -> Bool
isFoo (Foo _) = True
isFoo _ = False
isBar :: SomeData -> Bool
isBar (Bar _) = True
isBar _ = False
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个通用函数,如
checkType :: SomeClass -> SomeData -> Bool
checkType (SomeClass _) = True
checkType _ = False
Run Code Online (Sandbox Code Playgroud)
我意识到情况看起来有点奇怪,实际的用例有点复杂,但问题是相同的.
我正在尝试重构的实际代码如下
isString :: [LispVal] -> ThrowsError LispVal
isString [(String _)] = return $ Bool True
isString ((String _):xs) = isString xs >>= unpackBool >>= return . Bool
isString _ = return $ …Run Code Online (Sandbox Code Playgroud) 在Elixir中,如果我尝试模式匹配以下两个元组:
{a} = {1, 2}
Run Code Online (Sandbox Code Playgroud)
我得到一个匹配错误.但如果我对两张地图做同样的事情:
%{x: a} = %{x: 1, y: 2}
Run Code Online (Sandbox Code Playgroud)
它工作正常,并a绑定到1.我可以看到为什么匹配这两个元组给出了一个错误,但为什么匹配地图不会出错?
我想在Elixir写一个字谜检查器.它需要2个单词,第一个是参考,第二个是作为第一个可能的anagram测试.
我试图用递归和模式匹配来编写它.我in在一个保护条款中使用运算符时收到错误:
(ArgumentError)运算符输入无效的args,它在保护表达式中使用时需要右侧的编译时列表或范围
我不知道该怎么做才能解决它.这是代码(错误在第4个定义中):
defmodule MyAnagram do
def anagram?([], []), do: true
def anagram?([], word) do
IO.puts 'Not an anagram, the reference word does not contain enough letters'
false
end
def anagram?(reference, []) do
IO.puts 'Not an anagram, some letters remain in the reference word'
false
end
def anagram?(reference, [head | tail]) when head in reference do
anagram?(reference - head, tail)
end
def anagram?(_, [head | _]) do
IO.puts 'Not an anagram, #{head} is not in the reference …Run Code Online (Sandbox Code Playgroud) 以下按预期工作:
dynamic foo = GetFoo();
if (foo != null)
{
if (foo is Foo i)
{
Console.WriteLine(i.Bar);
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我像这样结合if语句:
if (foo != null && foo is Foo i)
{
Console.WriteLine(i.Bar);
}
Run Code Online (Sandbox Code Playgroud)
然后我收到编译器警告
Use of unassigned local variable 'i'
谁能解释为什么会这样?