gpt4 book ai didi

haskell - 使用 Haskell 的 "Maybe",类型声明[初学者的问题]

转载 作者:行者123 更新时间:2023-12-04 14:18:16 26 4
gpt4 key购买 nike

我已经开始尝试使用 Haskell 并且遇到了问题。 qqq 是一个函数,如果用“Nothing”调用应该打印一个字符串,如果用“Just something”调用则打印其他东西。

第一次尝试似乎有效:

qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x

main :: IO ()
main = qqq (Just 43)

但:
  • 当我尝试制作 main = qqq (Nothing)它失败了(“约束中的模糊类型变量‘a0’:(显示a0)由使用‘qqq’引起”)
  • 当我想添加类型签名如果失败:
  • qqq :: Maybe x => x -> IO () -> Type constructor 'Maybe' used as a class -> 但不是吗?
  • qqq :: (Maybe x) -> IO () .现在签名本身看起来成功了。但是main = qqq (Just 43)以那个神秘的(Show a0)开始失败main = qqq (Nothing) 中的错误案子。

  • 问题:
  • 为什么用Nothing调用qqq与使用 Just 43 调用有很大不同?
  • 什么是(Show a0) ?它仅在错误消息中提及。任何使用它的尝试都会导致类似“显示不在范围内”的结果。
  • 什么是正确的类型签名?如何制作它推导出的 Haskell 打印类型签名?期待类似:

  • f 0 = 2
    f x = (f (x-1)) + 3

    main = print get_type_as_string(f)
    -- prints "Number -> Number"

    最佳答案

    qqq的类型是:

    qqq :: Show a => Maybe a -> IO ()

    这意味着 qqq采用 Maybe a 类型的一个参数并返回一个没有值的 IO 操作,其约束条件为 a实现 Show类型类。找出什么 Show是,您可以使用 :i Show在 ghci 中。
    Show是一个类型类,它要求可以将类型的值转换为字符串。 qqq有约束,因为 print想要打印出该值( print 的类型为 Show a => a -> IO () )。 Maybe不是类型类而是数据类型。您可以阅读有关类型类的更多信息 here .

    您可以让 GHC 推断类型签名,方法是在 .hs 文件中键入函数,然后使用 ghci ( ghci Myfile.hs ) 加载文件,然后键入 :t qqq用于显示类型。您也可以使用 let qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x } 在交互 session 中定义函数。 (它看起来有点不同,因为函数定义必须在 ghci 中的一行,但含义是相同的)。

    当主叫 qqqqqq (Just 43) ,明确 Maybe a的具体类型是数字类型(ghci 默认为整数),所以 qqq具体类型为 Maybe Integer -> IO () .但是,主要调用 qqqqqq Nothing , a可以是任何东西(它是模棱两可的)并且 ghci 报告一个错误。

    关于haskell - 使用 Haskell 的 "Maybe",类型声明[初学者的问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6716330/

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