标签: pattern-matching

在C#中实现模式匹配

在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)

c# pattern-matching

18
推荐指数
3
解决办法
9598
查看次数

是否建议在Haskell中始终使用详尽的模式匹配,即使是"不可能"的情况?

是否建议在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)

模式不匹配(由解释器报告)是:

警告:模式匹配是非详尽的在案例替代方案中:模式不匹配:[]:_

haskell functional-programming pattern-matching

17
推荐指数
3
解决办法
2479
查看次数

在Scala中组合两个列表

从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)

现在我正在遍历两个列表并添加字符串是否相同,但我认为应该有一个简单的模式匹配解决方案.

scala list pattern-matching

17
推荐指数
3
解决办法
2万
查看次数

KMP模式匹配算法背后的理论是什么?

KMP模式匹配算法的理论基础是什么?

我理解算法本身,但是,不明白Knuth,Morris和Pratt是如何发明这种算法的.

有没有数学证明?

你能给个链接吗?

string algorithm pattern-matching knuth-morris-pratt

17
推荐指数
1
解决办法
3593
查看次数

Haskell:解析模式中的错误

谁喜欢告诉我这段代码有什么问题(语法上)?

-- 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

haskell pattern-matching operator-precedence parse-error

17
推荐指数
1
解决办法
2万
查看次数

SQLite3"LIKE"或PostgreSQL"ILIKE"的通用Ruby解决方案?

我使用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显示这两个数据库...嗯,令人失望...

sqlite postgresql search ruby-on-rails pattern-matching

17
推荐指数
3
解决办法
7398
查看次数

为什么变量在模式中绑定两次?

通常,F#不允许模式变量在同一模式中出现两次.但是在下面的代码中,F#没有抱怨 - 这是一个错误吗?

type foo = { A: int }
let test (x, {A = x}) = x
let result = test ("bla", {A = 3})
Run Code Online (Sandbox Code Playgroud)

f# pattern-matching

17
推荐指数
1
解决办法
547
查看次数

n + k模式的模式中的haskell解析错误

我已经开始通过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模式?

haskell pattern-matching ghci

17
推荐指数
2
解决办法
2987
查看次数

创建新的保护条款

在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)

function elixir pattern-matching

17
推荐指数
2
解决办法
5036
查看次数

过滤S3列表对象结果以查找与模式匹配的键

我想使用AWS CLI查询存储桶的内容,看看是否存在特定文件,但存储桶包含数千个文件.如何过滤结果以仅显示与模式匹配的键名?例如:

aws s3api list-objects --bucket myBucketName --query "Contents[?Key==*mySearchPattern*]"
Run Code Online (Sandbox Code Playgroud)

amazon-s3 pattern-matching aws-cli jmespath

17
推荐指数
1
解决办法
3万
查看次数