将动态字符串解析为 HostPreference

Parse dynamic String into HostPreference

使用 Warp librarysetHost 函数将不接受动态 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"

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

结果...像往常一样,Hoogle is our friend

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"

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