如何在带有Network.URI的代码中表示静态Haskell URI?

如何在带有Network.URI的代码中表示静态Haskell URI?,haskell,uri,Haskell,Uri,在Haskell包中有parseURI::String->Maybe URI函数 我希望在代码中有几个静态URI。写以下内容合理吗 Just myURI = parseURI "http://google.com/" 这方面的“问题”是,如果URI字符串实际上格式不正确,则仅在运行时捕获模式失败异常 我希望避免直接构造URI数据类型的繁琐(这会将URI分解,使其在某种程度上失去概念意义) 有没有更好的方法在代码中使用静态URI并更“安全”呢 写以下内容合理吗 Just myURI = pars

在Haskell包中有
parseURI::String->Maybe URI
函数

我希望在代码中有几个静态URI。写以下内容合理吗

Just myURI = parseURI "http://google.com/"
这方面的“问题”是,如果URI字符串实际上格式不正确,则仅在运行时捕获模式失败异常

我希望避免直接构造
URI
数据类型的繁琐(这会将URI分解,使其在某种程度上失去概念意义)

有没有更好的方法在代码中使用静态URI并更“安全”呢

写以下内容合理吗

Just myURI = parseURI "http://google.com/"
不,除非您确定您的URI没有格式错误,否则不要与
模式匹配。这样的URI将不提供任何内容,从而导致运行时错误:

λ> parseURI "http:/\\/google.com/"
Nothing
相反,只需在
Maybe
类型中表示URI,并使用
fmap
等函数对其进行计算。另一种方法是使用函数
isURI
或中定义的任何其他适当函数检查它是否包含有效的URI,然后处理适当的情况:

λ> isURI "http:/\\/google.com/"
False
λ> isURI "http://google.com"
True

我建议直接使用
URI
URIAuth
构造函数。您可以获得更多的文本,但也可以得到一个静态保证,即您确实有一个
URI
。但这正是你想要避免的:)

我希望避免直接构造URI数据类型的繁琐 (这会分解URI并使其失去概念意义 有点)

如果您真的开始使用字符串文本,那么您可以打开
OverloadedStrings
,并为
可能的URI
定义一个
IsString
实例,如下所示:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.String
import Network.URI

instance IsString (Maybe URI) where
    isString = parseURI

someUri :: Maybe URI
someUri = "http://google.ca"

您无法安全地转储
,可能
;您只需使用它。

在编译时使用Template Haskell使用
isURI
验证静态URL如何?现在URL必须有效,在运行时使用
fromJust
是安全的

例如,像这样定义
staticURI

{-# LANGUAGE TemplateHaskell #-}

module URI where

import Data.Maybe (fromJust)
import Network.URI (URI, isURI, parseURI)
import Language.Haskell.TH (Q, TExp)

staticURI :: String -> Q (TExp URI)
staticURI uri | isURI uri = [|| fromJust $ parseURI uri ||]
              | otherwise = fail $ "Invalid URI: " ++ uri
{-# LANGUAGE TemplateHaskell #-}

import Network.URI (URI)
import URI (staticURI)

url :: URI
url = $$(staticURI "http://www.google.com/")

badUrl :: URI
badUrl = $$(staticURI "http://www.google.com/##")
然后,您可以像这样在其他模块中定义URL

{-# LANGUAGE TemplateHaskell #-}

module URI where

import Data.Maybe (fromJust)
import Network.URI (URI, isURI, parseURI)
import Language.Haskell.TH (Q, TExp)

staticURI :: String -> Q (TExp URI)
staticURI uri | isURI uri = [|| fromJust $ parseURI uri ||]
              | otherwise = fail $ "Invalid URI: " ++ uri
{-# LANGUAGE TemplateHaskell #-}

import Network.URI (URI)
import URI (staticURI)

url :: URI
url = $$(staticURI "http://www.google.com/")

badUrl :: URI
badUrl = $$(staticURI "http://www.google.com/##")
将格式错误的URL传递给
staticURI
时,编译器将发出错误

Invalid URI: http://www.google.com/##
In the Template Haskell splice
  $$(staticURI "http://www.google.com/##")
In the expression: $$(staticURI "http://www.google.com/##")
In an equation for ‘url’:
    url = $$(staticURI "http://www.google.com/##")