gpt4 book ai didi

Haskell:如何通过 'no instance for' ?

转载 作者:行者123 更新时间:2023-12-04 06:56:28 25 4
gpt4 key购买 nike

我正在学习 Haskell。我在第8章this book .到目前为止,我学到的主要事情是 Haskell 对我非常不友好,它在可能的情况下咬我的屁股。而且……哎呀!够丧了,谈生意。

这是代码:

module GlobRegex (
globToRegex,
matchesGlob
) where

import Text.Regex.Posix
import Text.Regex.Posix.String
import Text.Regex.Base.RegexLike

data CaseOpt = Case | NoCase
deriving (Eq)

matchesGlob :: String -> String -> CaseOpt -> Bool
matchesGlob name pat caseopt = match regex name where
regex = case caseopt of
NoCase -> makeRegexOpts (defaultCompOpt + compIgnoreCase) defaultExecOpt (globToRegex pat)
Case -> makeRegex (globToRegex pat)

globToRegex :: String -> String
...

这是它无法编译的原因:
Prelude Text.Regex.Posix Text.Regex.Base.RegexLike> :load globtoregex\GlobRegex.
hs
[1 of 1] Compiling GlobRegex ( globtoregex\GlobRegex.hs, interpreted )

globtoregex\GlobRegex.hs:14:31:
No instance for (RegexLike regex [Char])
arising from a use of `match' at globtoregex\GlobRegex.hs:14:31-46
Possible fix:
add an instance declaration for (RegexLike regex [Char])
In the expression: match regex name
In the definition of `matchesGlob':
matchesGlob name pat caseopt
= match regex name
where
regex = case caseopt of {
NoCase
-> makeRegexOpts
(defaultCompOpt + compIgnoreCase)
defaultExecOpt
(globToRegex pat)
Case -> makeRegex (globToRegex pat) }

globtoregex\GlobRegex.hs:17:23:
No instance for (RegexMaker regex CompOption execOpt String)
arising from a use of `makeRegex'
at globtoregex\GlobRegex.hs:17:23-49
Possible fix:
add an instance declaration for
(RegexMaker regex CompOption execOpt String)
In the expression: makeRegex (globToRegex pat)
In a case alternative: Case -> makeRegex (globToRegex pat)
In the expression:
case caseopt of {
NoCase
-> makeRegexOpts
(defaultCompOpt + compIgnoreCase) defaultExecOpt (globToRegex p
at)
Case -> makeRegex (globToRegex pat) }
Failed, modules loaded: none.

据我所知, Text.Regex.Posix.StringRegexLike Regex String 提供实例和 RegexMaker Regex CompOption ExecOption String ,所以它应该工作。另一方面,我可以看到 regex在错误消息中是类型变量,而不是具体类型,所以,也许不是......无论如何,这就是我被卡住的地方。

可能有一个共同的解决模式 no instance for问题类型?或者,用 Haskell 术语来说,是 SmartGuess 的实例 no instance for 的类型类?

最佳答案

你在图书馆的一个角落里,我的眼睛很黑。但是我在您的错误消息中注意到编译器说 regex你说的地方Regex .你的代码太多态了,所以几乎可以肯定你在某处有非终止或者你将错误的参数传递给某些东西(并忽略了然后变成多态的参数)。

类型级 hell 并不好玩,但我认为如果您为 regex 输入类型签名,您可能会收到更多信息丰富的错误消息。进where条款。我无法弄清楚它应该是什么类型,但是如果您知道,这可能会将实例问题解决为更易于处理的类型错误。

我讨厌类型级的 hell 。

关于Haskell:如何通过 'no instance for' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484196/

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