相关疑难解决方法(0)

什么是单态限制?

令我感到困惑的是,haskell编译器有时会推断出比我预期的更不易变形的类型,例如在使用无点定义时.

似乎问题是"单态限制",默认情况下在旧版本的编译器上启用.

考虑以下haskell程序:

{-# LANGUAGE MonomorphismRestriction #-}

import Data.List(sortBy)

plus = (+)
plus' x = (+ x)

sort = sortBy compare

main = do
  print $ plus' 1.0 2.0
  print $ plus 1.0 2.0
  print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)

如果我编译它,ghc我没有获得错误,可执行文件的输出是:

3.0
3.0
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

如果我将main身体改为:

main = do
  print $ plus' 1.0 2.0
  print $ plus (1 :: Int) 2
  print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我没有编译时错误,输出变为:

3.0
3
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

正如所料.但是,如果我尝试将其更改为:

main = do
  print $ …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell types type-inference monomorphism-restriction

60
推荐指数
1
解决办法
4768
查看次数

如何从do符号传递给(>> =)运算符表示法?

我真的不明白为什么这样的代码行实际工作:

来自 Network.HTTP.Simple

{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import qualified Data.ByteString.Char8 as B8

main :: IO ()
main = httpBS "http://example.com" >>= B8.putStrLn . getResponseBody
Run Code Online (Sandbox Code Playgroud)

我可以用符号重写这些东西:

test = do
          request <- return "http://example.com"
          result <- httpBS request
          let body = getResponseBody result
          B8.putStrLn body
Run Code Online (Sandbox Code Playgroud)

这工作,即使我无法弄清楚是什么类型return "http://example.com".

Q1:编译器如何设法找到我想要使用的Monad?

我的猜测是:它来自do块的返回是一个IO(),因此它将是一个IO(请求)?

现在,当尝试在更复杂的代码中使用httpBS时,我遇到了一些困难

test.hs文件:

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}

import Network.HTTP.Simple
import qualified Data.ByteString.Char8 as B8


request = parseRequest "http://example.com" 
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

Prelude> :load test.hs
[1 of 1] Compiling …
Run Code Online (Sandbox Code Playgroud)

monads haskell

1
推荐指数
1
解决办法
118
查看次数