0

使用Warp 库,该setHost函数将不接受动态String值作为主机值,但它会对字符串文字非常满意:

> import           Network.Wai.Handler.Warp

> apiHost = "0.0.0.0" :: String
> getHost $ setHost (read apiHost) defaultSettings
*** Exception: Prelude.read: no parse

> getHost $ setHost apiHost defaultSettings
<interactive>:16:19: error:
    • Couldn't match type ‘[Char]’ with ‘HostPreference’
      Expected type: HostPreference
        Actual type: String

> getHost $ setHost "0.0.0.0" defaultSettings
Host "0.0.0.0"

当值是字符串文字时,一切正常,但是当它是动态生成的字符串时,我找不到任何方法让它工作。这正是我需要的,因为主机值来自环境变量。

4

2 回答 2

2

我看到您专门为这个库找到了答案,但是有一个更通用的解决方案。您能够使用字符串文字,因为 HostPreference 是IsString类的一个实例(并且您打开了 OverloadedStrings 扩展)。这意味着您可以使用fromString该类的方法,因此fromString (read apiHost)应该可以使用。

于 2021-05-26T08:57:28.450 回答
0

结果……像往常一样,Hoogle 是我们的朋友

String -> HostPreference

-- first result:
-- Host :: String -> HostPreference
-- streaming-commons Data.Streaming.Network.Internal

从那里

> import           Data.Streaming.Network.Internal (HostPreference (Host))

> apiHost = "0.0.0.0" :: String
> getHost $ setHost (Host apiHost) defaultSettings
Host "0.0.0.0"
于 2021-05-25T23:02:10.613 回答