gpt4 book ai didi

Haskell 开关/案例使用

转载 作者:行者123 更新时间:2023-12-02 02:50:09 29 4
gpt4 key购买 nike

作为我用 Haskell 编写的迷你解释器的一部分,我正在编写一个执行以下操作的函数:如果是 eval (App e1 e2) ,我想递归评估 e1 ( eval e1 ),将结果设置为 v1 .然后使用 Switch/Case,我想检查 v1 的模式如果不是错误,则递归计算 e2 ( eval e2 ) 并将该值设置为 v2 .使用这两个值 v1v2 ,然后我对这些值应用另一个函数( appVals )。

eval :: Exp -> Error Val
eval (App e1 e2) = appVals v1 v2 where
v1 = case (eval e1) of
Error err -> Error "Not an application"
/= Error err -> eval e1 = v1
v2 = case (eval e2) of
Error err -> Error "Not an application"
/= Error err -> eval e2 = v2

我想我可能已经弄清楚了,但我不完全确定我是否正确完成了开关/ shell 部分。任何想法/建议?

最佳答案

case 语句的第二部分不应该尝试重新测试,因为您已经知道它不是 Error - 这将与第一个匹配。 (跳过 /= Error err。)
eval e1 = v1尝试重做您在开始时所做的评估。你不需要这样做。

这是我认为你打算做的:

eval :: Exp -> Error Val
eval (App e1 e2) = case eval e1 of
Error _ -> Error "Not an application"
S v1 -> case eval e2 of -- nested case statement
Error _ -> Error "Not an application"
S v2 -> appVals v1 v2 -- match the S away

但这一切似乎有点难看,所以让我们从 Gabriel Gonzalez 那里得到很好的建议,并用 Error 做一个应用程序。 .
instance Functor Error where
fmap f (Error e) = Error e -- pass through errors
fmap f (S x) = S (f x) -- edit successes

例如, fmap (+4) (Error "oops") = Error "oops"fmap (+4) (S 5) = S 9 .

如果这个 fmap对您来说是全新的,何不阅读 Functors tutorial ?

接下来让我们创建一个 Applicative 实例。 Applicative 让你可以像简单的函数一样使用复杂的函数。
您需要 import Control.Applicative在文件顶部以使其正常工作。
instance Applicative Error where
pure x = S x -- how to put ordinary data in
S f <*> S x = S (f x)
Error e <*> _ = Error e
_ <*> Error e = Error e

现在,如果没有任何错误,那么您将定义
appVal' :: Val -> Val -> Val

eval' :: Exp -> Val
eval' (App e1 e2) = appVal' (eval' e1) (eval' e2)

有了 applicative,我们可以使用 <$>有点像 $除了它执行您在 fmap 中定义的任何管道.
同样, <*>有点像 函数应用程序,除了额外的管道,所以我们可以定义
eval :: Exp -> Error Val
eval (App e1 e2) = appVals <$> eval e1 <*> eval e2

这是处理幕后错误同时专注于功能的好方法。

关于Haskell 开关/案例使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444862/

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