gpt4 book ai didi

haskell - printf返回了什么?

转载 作者:行者123 更新时间:2023-12-03 13:22:38 26 4
gpt4 key购买 nike

我正在学习 Haskell,这些是我尝试理解语法的第一步。我过得很艰难,不幸的是,语言引用没有帮助。

我试着做:type (line_length 1 2 3 4)我有红色的reference on printf但是,它使用含义模糊的符号而不是文字。所以,我被困住并寻求帮助。

简单地说:我写什么来代替??? .

line_length :: Integer -> Integer -> Integer -> Integer -> ???
line_length ax ay bx by =
printf ("The length of the line between the points" ++
"(%d,%d) and (%d,%d) is %.5f\n") ax ay bx by
((((fromIntegral (ax - bx)) ** 2.0) +
((fromIntegral (ay - by))) ** 2.0) ** 0.5)

最佳答案

printf :: PrintfType r => String -> r 的重载返回类型可能有点令人困惑,但查看 PrintfType 会有所帮助可用的实例:

  • 首先,我们有这个实例:
    instance (PrintfArg a, PrintfType r) => PrintfType (a -> r)

    这个是用来允许printf采用可变数量的参数。由于柯里化(Currying),这是有道理的,但您可能不会认为它是函数的“真实”返回类型。有关其工作原理的更多信息,请参阅 How does printf work in Haskell? .
  • 然后我们有这个实例,
    instance PrintfType (IO a)

    这意味着我们可以将其用作 IO行动。类似于 print ,这会将结果打印到标准输出。操作的结果是 undefined ,所以你应该忽略它。1
    > printf "Foo %d\n" 42 :: IO ()
    Foo 42
    > it
    *** Exception: Prelude.undefined
  • 最后,
    instance IsChar c => PrintfType [c]

    这里的类型类主要是为了让它符合 Haskell 98。由于 IsChar 的唯一实例是 Char , 你可以把它想象成
    instance PrintfType String

    但这需要特定于 GHC 的扩展 FlexibleInstances .

    这个实例的意思是你也可以只返回一个 String不打印,类似于 sprintf在 C.
    > printf "Foo %d\n" 42 :: String
    "Foo 42\n"

  • 因此,根据您是要打印结果还是只返回结果,您可以替换 ???IO ()String在你的例子中。

    但是,您的代码还有另一个问题是编译器无法确定您希望最后一个参数是哪种类型,因此您必须使用类型注释来帮助它:
    line_length :: Integer -> Integer -> Integer -> Integer -> String
    line_length ax ay bx by =
    printf ("The length of the line between the points" ++
    "(%d,%d) and (%d,%d) is %.5f\n") ax ay bx by
    ((((fromIntegral (ax - bx)) ** 2.0) +
    ((fromIntegral (ay - by))) ** 2.0) ** 0.5 :: Double)

    1 这样做是为了避免扩展。有了扩展,我们可以写成 instance PrintfType (IO ())结果将是 () .

    关于haskell - printf返回了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393128/

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