如何在带有Network.URI的代码中表示静态Haskell URI?
在Haskell包中有如何在带有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
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/##")