繁体   English   中英

如何改进我的 Haskell 代码并使其正常工作?

[英]How can I improve my Haskell code and make it work?

在我的代码中,我使用 FEN 字符串调用 validateFEN function。 例如,Fen 字符串如下所示:

",w84,w41,w56,w170,w56,w41,w84,/,,w24,w40,w17,w40,w48,,/,,,w16,w16,w16,,,/,,,,,,,,/,,,,,,,,/,,,,,,,,/,,,b1,b1,b1,,,/,,b3,b130,b17,b130,b129,,/,b69,b146,b131,b170,b131,b146,b69,"

function 应该获取该字符串并检查它是否为 FEN 字符串。 它如何知道它是否是 FEN 字符串? -> 我的字符串有 9 行和 9 列。 我不需要检查碎片(例如:w86)是否在其右侧 position。

validateFEN' b = help3 (filter (\x -> x == ',' || x == '/' ) b)

help3 b =  (if help1 b == True then (if head (drop 8 b) == '/' then help3 (drop 9 b) else False) else False )

help1 b = help2 (take 8 b)

help2 b = foldr (+) 0 (map (\x -> if x == ',' then 1 else 0 )b) == 8

为什么我不断收到空列表的错误?

异常:Prelude.head:空列表

我知道我的代码没有停止。 该程序不知道字符串何时“正确”。

有没有更短更简单的方法来做到这一点?

重用现有库函数以使其更清晰的一种方法是使用stripPrefix

help3 s = case stripPrefix ",,,,,,,,/" s of
    Nothing -> False
    Just s' -> help3 s'

当然,您仍然需要处理没有终止/的最后一种情况。 这可以通过一个额外的子句来完成:

help3 ",,,,,,,," = True
help3 s = {- ... -}

您可能想考虑validateFEN'是否应该对空字符串有类似的特殊情况。

但我强烈建议首先不要实施validateFEN' 我的猜测是该计划是这样的:

  1. 检查字符串是否为有效的 FEN。
  2. 假设 FEN-ness 处理字符串。

相反,我推荐以下方法:

  1. 将字符串解析为表示 FEN 字符串中可用信息的本机数据结构。
  2. 处理本机结构。

第 1 步,如果使用标准解析解决方案编写,将“意外地”验证字符串——即运行解析器将返回类似Either Error FEN的内容,您可以对其进行模式匹配以发现字符串无效或有效并已变成更惯用的表示形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM