gpt4 book ai didi

generics - 模式匹配,其中模式基于(函数)参数

转载 作者:行者123 更新时间:2023-12-02 22:07:36 25 4
gpt4 key购买 nike

我想编写一个兼具两者的函数

  • 特定代数数据类型的值构造函数,以及
  • 同一类型的实际值,

并确定给定值是否是由给定构造函数“创建”的。模式匹配似乎很适合这种情况,但要匹配的模式必须是函数参数而不是硬编码的构造函数名称。

下面的代码是我尝试过的,但 GHC 在指示的行上报告了解析错误。

有办法实现这一点吗?

data FooBar = Foo Int | Bar String

-- Imagine that these are useful functions.
processInt :: Int -> String
processInt = show
processString :: String -> String
processString = id

-- This should take one of the above functions and adapt it to operate on
-- FooBar values of compatible "type". Values that match the given FooBar
-- constructor should be "unwrapped" and passed to the given function.
typeCheck :: (a -> FooBar) -> (a -> String) -> (FooBar -> Maybe String)
typeCheck constructor func fooBar = case fooBar of
(constructor x) -> Just (func x) -- GHC says "Parse error in pattern: constructor"
_ -> Nothing

-- Define processing functions that operate on FooBars.
processFoo :: FooBar -> Maybe String
processFoo = typeCheck Foo processInt
processBar :: FooBar -> Maybe String
processBar = typeCheck Bar processString

最佳答案

有趣的想法。我想知道你想做什么,因为这是一个非常不寻常的模式匹配问题。

如果你能做到的话,你当然可以做到:

  • 枚举类型的构造函数
  • 类型元素相等

就像这样(我分解了 f 部分的应用,因为它是正交的):

wasBuilt :: Eq t => (t -> Either t t)   -- ^ the constructor
-> Either t t -- ^ a value
-> Maybe t -- ^ the transformed result

wasBuilt k v = case v of
Left x | v == k x -> Just x
Right x | v == k x -> Just x
_ -> Nothing

但是有很多样板文件。这个问题让我感到“泛型”。尝试不同的方法,并将构造函数反射(reflect)到数据,然后在该数据上进行一般匹配,也许。这将允许您将构造函数视为值,而不是函数。

<小时/>

这大概是我的想法,但请注意,这是一项高级技术。常规 AST 上的显式模式匹配更加惯用:

import Generics.SYB

-- only works for unary constructors
sameConstructor :: (Data a, Data b) => (a -> b) -> b -> Bool
sameConstructor k v = toConstr v == toConstr (k undefined)

> sameConstructor (Left :: Char -> Either Char Char) (Right 'x')
False

> sameConstructor (Left :: Char -> Either Char Char) (Left 'x')
True

> sameConstructor (:[]) "haskell"
True

关于generics - 模式匹配,其中模式基于(函数)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com