gpt4 book ai didi

Haskell - 在模式匹配中使用常量

转载 作者:行者123 更新时间:2023-12-02 18:07:35 24 4
gpt4 key购买 nike

假设我有以下代码(<> 中的文本是简写,实际上不是代码的一部分):

data A = <something>
defaultA :: A
defaultA = <Really complicated expression of type A>

现在我想在 defaultA 上进行函数模式匹配,像这样:

f defaultA = <case 1>
f _ = <case 2>

但是,defaultA第一行中成为一个新变量,而不是意味着参数等于 defaultA 的条件。我知道实现我想要的目标的最好方法是:

f x | x == defaultA = <case 1>
f _ = <case 2>

有谁知道更好的方法吗?

最佳答案

如果 defaultA 的定义仅包含构造函数调用,则可以使用 pattern synonym .

{-# LANGUAGE PatternSynonyms #-}

data A = A Int

pattern DefaultA = A 3

isDefaultA DefaultA = putStrLn "it was a default"
isDefaultA _ = putStrLn "it was not a default"

但这并不是一个特别惯用的 PatternSynonyms 部署。我可能会坚持使用 Haskell 98,使用一个非常冗长的保护子句和相等测试。

data A = A Int deriving Eq

defaultA = A 3

isDefaultA a
| a == defaultA = putStrLn "it was a default"
| otherwise = putStrLn "it was not a default"
<小时/>

模式同义词的用处是,当您使用像自由单子(monad)这样的模式进行数据类型通用编程时,可以封装强加给您的嘈杂的库构造函数调用或Data Types a la Carte .

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeOperators #-}

-- fixed point of functor
newtype Expr f = In (f (Expr f))

-- functor coproduct
data (f :+: g) a = Inl (f a) | Inr (g a)


-- now plug in custom code
data Add r = Add_ r r
data Val r = Val_ Int
type HuttonsRazor = Expr (Add :+: Val)

pattern Add x y = In (Inl (Add_ x y))
pattern Val x = In (Inr (Val_ x))

eval :: HuttonsRazor -> Int
eval (Add x y) = eval x + eval y
eval (Val x) = x

关于Haskell - 在模式匹配中使用常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429144/

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