【问题标题】:Getting <<loop>> Exception in Haskell Depending on Pattern Arrangement根据模式排列在 Haskell 中获取 <<loop>> 异常
【发布时间】:2016-11-13 03:17:30
【问题描述】:

谁能解释一下为什么我在这段代码中出现了一个循环?

module Main where

import Data.List.Split
import Data.Maybe
import Text.Read

main :: IO ()
main = print (snd (toInmetDate "01/02/2012"))

type P a = (Bool, a)

readP :: (Read a) => String -> P a
readP text
  | isJust value    = (True, fromJust value)
  | isNothing value = (False, read "0")
  where value = readMaybe text

data InmetDate = InmetDate {dia :: P Int, mes :: P Int, ano :: P Integer}
  deriving (Show, Read)

toInmetDate :: String -> P InmetDate
toInmetDate x = if length l == 3
  then  (True, InmetDate (readP ds) (readP ms) (readP as))
  else  (False, InmetDate (False, 0) (False, 0) (False, 0))
  where (l,ds:ms:as:_) = (splitOn "/" x, l ++ replicate 20 "NULL")

我会说,当我制作时:

  where (l,ds:ms:as:_) = (splitOn "/" x, l ++ replicate 20 "NULL")

等于:

  where (ds:ms:as:_) = l ++ replicate 20 "NULL"
        l = splitOn "/" x

代码完美运行。

【问题讨论】:

  • 如果投反对票,请让我最后知道原因,以便我找出问题所在,谢谢...
  • 我没有投反对票,但如果我心情不合理,那么我可能会因为代码片段没有编译(需要一些导入,main 进行测试)。
  • 最近似乎对很多 Haskell 问题投了反对票。也许有人心怀不满并试图使社区士气低落。
  • 很遗憾,在几年前第一次接触 Haskell 之后,我与 Haskell 有了更多的联系,发现它是一种美丽的语言,有点难,但非常美丽。

标签: haskell


【解决方案1】:

在您的原始文件中,l 的值取决于根据 l 递归定义的元组。在更改中,l 仅取决于 splitOn "/" x 的值。

【讨论】:

  • 对元组第二个元素的模式匹配的严格性会引起很多混乱。例如,显式懒惰有效where (l,~(ds:ms:as:_)) = (splitOn "/" x, l ++ replicate 20 "NULL")
  • 在对严格性进行了更多搜索之后,我相信我终于明白了,我将haskell误解为lazy而不是non-strict语言
  • @RomuloPBenedetti,我很高兴你感到满意,但我觉得我需要指出你可能不理解它。 lazynon-strict 就您将获得的输出而言意味着完全相同的东西(这里有一个 subtle distinction 无关紧要)。我认为 Thomas 是对的,这是关于模式匹配的严格性。
  • 您可以阅读一些关于惰性模式匹配的内容here,这可能会有所帮助,尽管我找不到我真正喜欢的解释。
  • 好吧混淆,让我再看一遍......所以Haskell不是纯粹的懒惰,只是纯粹的非严格,从外到内减少,但是,据我现在的理解,非严格的评估不需要在计算上偷懒。现在,问题,据​​我了解here:由于您在链接上指出的一些暗示,模式匹配是否特别严格是强制非懒惰的原因?喜欢避免模式重叠?
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2021-03-07
  • 2021-04-13
  • 1970-01-01
  • 2015-06-11
  • 2017-02-27
  • 1970-01-01
  • 2011-07-10
相关资源
最近更新 更多