gpt4 book ai didi

haskell - 在 Haskell 中使用映射时跳过异常

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

我有以下代码来返回字符串中循环的长度:

module Main where
import Data.List

detec ys n | 2*n > (length ys) = error "no cycle"
| t == h = (2*n - n)
| otherwise = detec ys (n+1)
where
t = ys !! n
h = if n == 0 then ys !! 1 else ys !! (n*2)
f x = detec (show x) 0
answer = map f [1/x|x<-[1..100]]

但我不知道该怎么做,让它忽略“无循环”异常,以便生成的列表仅包含循环字符串的长度。

我该怎么做?

最佳答案

请不要使用error来实现预计会出现“错误”结果的逻辑。

相反,为什么不返回也许n而不是仅仅n,然后use catMaybes过滤掉Nothing

更改很容易:

module Main where
import Data.List
import Data.Maybe

detec ys n | 2*n > (length ys) = Nothing
| t == h = Just (2*n - n)
| otherwise = detec ys (n+1)
where
t = ys !! n
h = if n == 0 then ys !! 1 else ys !! (n*2)

f x = detec (show x) 0
answer = catMaybes $ map f [1/x|x<-[1..100]]

顺便说一句,您正在索引超出列表末尾的内容;也许您想检查 2*n + 1 > length ys?稍微偏离主题,我想提一下 !!length 在应用于列表时,在大多数情况下都是低效且不惯用的,尤其是在像这样的迭代结构。列表类型基本上是一个 cons 单元列表,它本质上是递归数据结构,并且强调不是数组。理想情况下,您应该避免使用无法通过模式匹配轻松表达的列表执行任何操作,例如 f (x:xs) = ...

关于haskell - 在 Haskell 中使用映射时跳过异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156569/

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