gpt4 book ai didi

haskell - 也许 Haskell 实现

转载 作者:行者123 更新时间:2023-12-03 04:40:59 28 4
gpt4 key购买 nike

step :: [Int] -> String -> [Int]
step (x:y:ys) "*" = (x*y):ys
step (x:y:ys) "+" = (x + y):ys
step (x:y:ys) "-" = (y - x):ys
step xs numString = read numString : xs

我正在扩展我的知识, http://learnyouahaskell.com/functionally-solving-problems ,我想尝试使用 Maybe 进行一些错误处理。谁能给我一些关于定义以下函数的提示或任何有用的关键字(如果我的想法是正确的)?当我成功输入值时,我想返回 Just sts ,而当我没有成功输入值时,我想返回 Nothing 。不知道我的想法是否正确,请大家指正。

 step2:: [Int] -> String -> Maybe [Int]

最佳答案

您的类型签名是正确的。这是一种可能的实现:

import Text.Read (readMaybe)

step2 :: [Int] -> String -> Maybe [Int]
step2 (x:y:ys) "*" = Just $ (x*y):ys
step2 (x:y:ys) "+" = Just $ (x + y):ys
step2 (x:y:ys) "-" = Just $ (y - x):ys
step2 xs numString | Just num <- readMaybe numString = Just $ num:xs
step2 _ _ = Nothing

基本思想是,对于所有现有案例,将它们包装在 Just 中,然后在最后,笼统地包含 Nothingread 有一些特殊处理,因为如果失败它只会抛出错误,因此您需要使用 readMaybe 和模式匹配来代替。

<小时/>

还有另一种写法可以缩短一点:

import Text.Read (readMaybe)

step2 :: [Int] -> String -> Maybe [Int]
step2 (x:y:ys) "*" = Just $ (x*y):ys
step2 (x:y:ys) "+" = Just $ (x + y):ys
step2 (x:y:ys) "-" = Just $ (y - x):ys
step2 xs numString = fmap (:xs) (readMaybe numString)

我们能够进行此更改有几个原因:

  • readMaybe 返回的结果包装在与我们的函数相同的类型中 (Maybe)
  • 该常见类型(也许)是一个仿函数

因此,我们可以将 fmap 应用于 readMaybe 的输出来组合最后两种情况。对于 Maybe 类型,fmap 的工作方式是将 Nothing 保留为 Nothing,或更改 Just xJust (f x),这正是我们正在做的事情。

关于haskell - 也许 Haskell 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605088/

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