在Scala中,您可以使用模式匹配来生成结果,具体取决于输入的类型.例如:
val title = content match {
case blogPost: BlogPost => blogPost.blog.title + ": " + blogPost.title
case blog: Blog => blog.title
}
Run Code Online (Sandbox Code Playgroud)
在C#中,我最好能够写:
var title = Visit(content,
(BlogPost blogPost) => blogPost.Blog.Title + ": " + blogPost.Title,
(Blog blog) => blog.Title
);
Run Code Online (Sandbox Code Playgroud)
这可能吗?当我尝试将其作为单一方法编写时,我不知道如何指定泛型.以下实现似乎是正确的,除了让类型检查器允许接受T的子类型的函数:
public TResult Visit<T, TResult>(T value, params Func<T, TResult>[] visitors)
{
foreach (var visitor in visitors)
{
if (visitor.Method.GetGenericArguments()[0].IsAssignableFrom(value.GetType()))
{
return visitor(value);
}
}
throw new ApplicationException("No match");
}
Run Code Online (Sandbox Code Playgroud)
我最接近的是将函数单独添加到对象,然后调用访问值:
public class Visitor<T, TResult>
{
private class Result …Run Code Online (Sandbox Code Playgroud) 是否建议在Haskell中始终使用详尽的模式匹配,即使是"不可能"的情况?
例如,在下面的代码中,我在foldr的"累加器"上进行模式匹配.我完全控制累加器的内容,因为我创建它(它不作为输入传递给我,而是在我的函数中构建).因此,我知道某些模式永远不应该匹配它.如果我努力永远不会得到"模式匹配是非穷尽的"错误,那么我会为它设置一个模式匹配,只是错误的消息"这个模式应该永远不会发生".很像C#中的断言.我想不出别的事情.
在这种情况下你会推荐什么做法?为什么?
这是代码:
gb_groupBy p input = foldr step [] input
where
step item acc = case acc of
[] -> [[item]]
((x:xs):ys) -> if p x item
then (item:x:xs):ys
else [item]:acc
Run Code Online (Sandbox Code Playgroud)
模式不匹配(由解释器报告)是:
警告:模式匹配是非详尽的在案例替代方案中:模式不匹配:[]:_
从2个表格列表List[(Int, String):
l1 = List((1,"a"),(3,"b"))
l2 = List((3,"a"),(4,"c"))
Run Code Online (Sandbox Code Playgroud)
如何组合Integers String相同的s来获得第三个列表:
l3 = List((4,"a"),(3,"b"),(4,"c"))
Run Code Online (Sandbox Code Playgroud)
现在我正在遍历两个列表并添加字符串是否相同,但我认为应该有一个简单的模式匹配解决方案.
KMP模式匹配算法的理论基础是什么?
我理解算法本身,但是,不明白Knuth,Morris和Pratt是如何发明这种算法的.
有没有数学证明?
你能给个链接吗?
谁喜欢告诉我这段代码有什么问题(语法上)?
-- merge two sorted lists
mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX a:as b:bs res
| a > b = mergeX as b:bs a:res
| otherwise = mergeX a:as bs b:res
Run Code Online (Sandbox Code Playgroud)
解释:
解析模式中的错误:mergeX
我使用SQLite3进行开发,使用PostgreSQL进行部署.但是,我面临以下问题:
我的简单搜索使用SQLite3:
def self.search(search)
if search
find(:all, :conditions => ["style LIKE ? OR construction LIKE ?", "%#{search}%", "%#{search}%"])
else
find(:all)
end
end
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用PostgreSQL,我需要替换LIKEfor ILIKE来解决问题:
def self.search(search)
if search
find(:all, :conditions => ["style ILIKE ? OR construction ILIKE ?", "%#{search}%", "%#{search}%"])
else
find(:all)
end
end
Run Code Online (Sandbox Code Playgroud)
是否有"Ruby方式"在任何数据库中进行这些搜索?
编辑 - 基于您的答案我不相信我会找到一个通用的Ruby解决方案.
我也跟着Ruby on Rails的教程:学习的榜样导轨-由迈克尔·哈特尔,在最终的Gemfile显示这两个数据库...嗯,令人失望...
通常,F#不允许模式变量在同一模式中出现两次.但是在下面的代码中,F#没有抱怨 - 这是一个错误吗?
type foo = { A: int }
let test (x, {A = x}) = x
let result = test ("bla", {A = 3})
Run Code Online (Sandbox Code Playgroud) 我已经开始通过Erik Meijer的13个部分讲座(以及Graham Hutton的幻灯片)来学习Haskell.
在第4章的幻灯片上,第13页介绍了n + k模式的模式匹配语法.特别是,它说:
与数学一样,整数函数可以使用n + k模式定义,其中n是整数变量,k> 0是整数常量.
pred :: Int -> Int
pred (n+1) = n
Run Code Online (Sandbox Code Playgroud)
当我在REPL中自己尝试这个时,我收到一条错误消息:
*Main> let mypred (n+1) = n
<interactive>:65:13: Parse error in pattern: n + 1
Run Code Online (Sandbox Code Playgroud)
同样,如果我在*.hs文件中尝试它
mypred :: Int -> Int
mypred (n+1) = n
Run Code Online (Sandbox Code Playgroud)
编译器给出了类似的抱怨:
/Users/pohl/Code/praxis-haskell/helloworld.hs:14:9:
Parse error in pattern: n + 1
Run Code Online (Sandbox Code Playgroud)
我不明白如何使用n + k模式?
在Elixir中,我将如何为函数创建新的保护条款?显然,我已经看到你不能只在一个when语句中调用任何函数,但是能够做到这样的事情会很好:
defmodule Player do
def play_card(player), do: []
def play_card(player) when has_cards(player), do: ...
# Define has_cards as guard clause?
end
Run Code Online (Sandbox Code Playgroud) 我想使用AWS CLI查询存储桶的内容,看看是否存在特定文件,但存储桶包含数千个文件.如何过滤结果以仅显示与模式匹配的键名?例如:
aws s3api list-objects --bucket myBucketName --query "Contents[?Key==*mySearchPattern*]"
Run Code Online (Sandbox Code Playgroud)