Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell IO单子示例_Haskell - Fatal编程技术网

Haskell IO单子示例

Haskell IO单子示例,haskell,Haskell,考虑以下IO代码: ghci> let x = return 100 :: IO Int ghci> :t do { a <- x; print a; return 500 } do { a <- x; print a; return 500 } :: Num b => IO b 在上述示例中,我的理解是: x具有类型IO Int print a具有类型IO() return 500具有类型Num b=>IO b 在我看来,IO()不符合类型,numb=>i

考虑以下
IO
代码:

ghci> let x = return 100 :: IO Int

ghci> :t do { a <- x; print a; return 500 }
do { a <- x; print a; return 500 } :: Num b => IO b
在上述示例中,我的理解是:

  • x
    具有类型
    IO Int
  • print a
    具有类型
    IO()
  • return 500
    具有类型
    Num b=>IO b
在我看来,
IO()
不符合类型,
numb=>iob
。另外,据我所知,
IO Int
不符合
Num b=>IO b

如果这个观察是有效的,那么为什么要编译这个代码呢?每一行,即
>=
,不得符合
MB
,其中
m
等于IO和
b
等于
Num b=>b

是否打印>>返回500

>
的签名是
(>>)::Monad m=>ma->mb->mb
,它与所看到的内容同步。

do{a>=print>>返回500


>
的签名是
(>>)::Monad m=>ma->mb->mb
,它与所看到的内容同步。

您将desugars发布到下面的代码

x >>= (\a ->
print a >>
return 500)
或者,扩展
(>>)

然后,您可以看到在对
(>>=)
的不同调用中,
a
b
的类型不一定相同

  • 在第一个调用中:
    x
    具有type
    IO Int
    \a->print a>=(\\\u->return 500)
    具有type
    Num c=>Int->IO c
    ,因此我们的
    (>=)
    类型签名中的
    a
    Int
    ,而
    b
    c
    (带有
    Num
    限制)

  • 在第二个调用中:
    print a
    具有type
    IO()
    ,而
    \\u500
    具有type
    Num c=>()->IO c
    ()
    部分是通过尝试匹配
    (>=)
    )的签名推断出来的,因此
    (>=)
    的类型签名中的
    a
    ()
    ,而
    b
    c
    (仍然有
    Num
    限制)


    • 您将desugars发布到下面的代码中

      x >>= (\a ->
      print a >>
      return 500)
      
      或者,扩展
      (>>)

      然后,您可以看到在对
      (>>=)
      的不同调用中,
      a
      b
      的类型不一定相同

      • 在第一个调用中:
        x
        具有type
        IO Int
        \a->print a>=(\\\u->return 500)
        具有type
        Num c=>Int->IO c
        ,因此我们的
        (>=)
        类型签名中的
        a
        Int
        ,而
        b
        c
        (带有
        Num
        限制)

      • 在第二个调用中:
        print a
        具有type
        IO()
        ,而
        \\u500
        具有type
        Num c=>()->IO c
        ()
        部分是通过尝试匹配
        (>=)
        )的签名推断出来的,因此
        (>=)
        的类型签名中的
        a
        ()
        ,而
        b
        c
        (仍然有
        Num
        限制)

      为什么应该
      IO()
      需要坚持类型?为什么
      IO Int
      不符合约束条件?请注意,
      do
      块的已删除版本使用
      >=
      >
      。还要注意中间类型对于这里的结果类型并不重要,例如
      f=const 3.words.show
      具有类型
      (Show a,Num b)=>a->b
      ,虽然
      words
      有type
      String->[String]
      。为什么
      IO()
      需要坚持类型?为什么
      IO Int
      不符合约束条件?请注意,
      do
      块的已删除版本使用
      >=
      >
      。还要注意中间类型对于这里的结果类型并不重要,例如
      f=const 3.words.show
      具有类型
      (显示a,Num b)=>a->b
      ,尽管
      单词
      的类型为
      String->[String]
      x       >>= (\a ->
      print a >>= (\_ ->
      return 500))