Haskell 类型是什么;显示a=>;也许a->;IO()”;意思是

Haskell 类型是什么;显示a=>;也许a->;IO()”;意思是,haskell,types,Haskell,Types,我有一个代码片段,如下所示 displayAge :: Show a => Maybe a -> IO () displayAge maybeAge = case maybeAge of Nothing -> putStrLn "Invalid year" Just maybeAge -> putStrLn $ show maybeAge 此函数从控制台获取其参数,并通过readMay函数传递给它,如下所示: main = do putStrLn

我有一个代码片段,如下所示

displayAge :: Show a => Maybe a -> IO ()
displayAge maybeAge =
  case maybeAge of
    Nothing -> putStrLn "Invalid year"
    Just maybeAge -> putStrLn $ show maybeAge
此函数从控制台获取其参数,并通过
readMay
函数传递给它,如下所示:

main = do
  putStrLn "Your birth year"
  strYear <- getLine
  let maybeAge = do
        intYear <- readMay strYear
        return (processYear intYear)
  displayAge maybeAge
main=do
putStrLn“你的出生年份”

strYear
displayAge
采用类型为
a
值,其中
a
是任何类型的
Show
n


首先读取Haskell签名中
=>
右侧的内容通常是有用的,即
可能是a->IO()

显示
获取类型为
a
可能是
的值,其中
a
是可以显示的任何类型


首先阅读Haskell签名中
=>
右侧的内容通常很有用,即
可能是一个->IO()

,因此,这是一个类型声明,因此它将告诉您需要向函数
displayAge
提供什么才能让类型检查器满意。下面的几行实际上描述了函数的工作方式。类型声明是(几乎总是)可选的,但它们是重要的文档,并且经常使错误消息更有意义,因为编译器现在知道您想做什么,并且可以将其与您实际做的进行比较

显示一个
声明的第一部分,即
=>
前面的一段,告诉我们一些关于
a
的事情。我们注意到
a
是小写,因此它不是一个类型,而是一个类型变量。当您实际使用
displayAge
功能时,您可以使用您想要的任何类型来代替
a
(Int、String、[Double]等),但这表示该类型必须有一个
Show
实例。所以几乎任何类型的函数都不是。如果haskell中的类仍然让您感到困惑,请查看(实际上,它与\u Why的Ruby教程一样好)

可能是一个
有很多方法可以读取Haskell类型的签名,但是如果你是新的,那么把最后一个箭头(
->
)之前的所有类型都看作是“输入”,最后一个类型看作是“输出”。这个想法忽略了currying和一流函数,但它确实可以帮助你开始

因此,该函数需要一个
可能是一个
,并将为您提供一个
IO()

那么什么是
可能是
?如果你不熟悉
类型,你当然应该努力做到这一点。它是二阶类型。这意味着为了使用它,您需要给它一些其他类型来包含。也许还有其他类型的。因此,
可能Int
保持和
Int
,而
可能String
保持一个
字符串。但是这个函数被设计用来处理一个包含任何类型的
或者
(只要它有一个上面提到的Show实例)。请再次注意,小写字母
a
如果此函数特别需要某种类型,它将使用以大写字母开头的类型

IO()
好吧,这可能是最难的部分。这个函数不是计算一些新的值,而是对现实世界做一些事情——haskell世界之外的所有事物都是现实世界。因此,用户输入和输出、网络内容和可变内存都必须放在IO类型中。(是的,这是第二顺序,就像可能)这是著名的和可爱的伊奥·莫纳德,我们希望你已经听说过,并将学会爱。当函数带有类型
IO()
时,它意味着它做了一些事情,而不是返回一个值。在我们的例子中,我们认为它可能会显示和老化,对吗?。您需要在
do
块中使用
displayAge
,类似于
main
函数*



*严格来说这不是真的,你可以用bind(
>=
)来代替它,但这显然是一个初学者的问题,我们有一个关于不编写monad教程的规则,对吗?

所以,这是一个类型声明,因此,它将告诉您需要为函数
displayAge
提供什么,以使类型检查器满意。下面的几行实际上描述了函数的工作方式。类型声明是(几乎总是)可选的,但它们是重要的文档,并且经常使错误消息更有意义,因为编译器现在知道您想做什么,并且可以将其与您实际做的进行比较

显示一个
声明的第一部分,即
=>
前面的一段,告诉我们一些关于
a
的事情。我们注意到
a
是小写,因此它不是一个类型,而是一个类型变量。当您实际使用
displayAge
功能时,您可以使用您想要的任何类型来代替
a
(Int、String、[Double]等),但这表示该类型必须有一个
Show
实例。所以几乎任何类型的函数都不是。如果haskell中的类仍然让您感到困惑,请查看(实际上,它与\u Why的Ruby教程一样好)

可能是一个
有很多方法可以读取Haskell类型的签名,但是如果你是新的,那么把最后一个箭头(
->
)之前的所有类型都看作是“输入”,最后一个类型看作是“输出”。这个想法忽略了currying和一流函数,但它确实可以帮助你开始

因此,该函数需要一个
可能是一个
,并将为您提供一个
IO()

那么什么是
可能是
?如果你不熟悉
类型,你当然应该努力做到这一点。它是二阶类型。这意味着为了使用它,您需要给它一些其他类型来包含。也许还有其他类型的。所以
可能Int
保持和
Int
,并且
可能Stri