Haskell从URLType提取主机名
我正在使用并从字符串导入URL:Haskell从URLType提取主机名,haskell,monads,maybe,Haskell,Monads,Maybe,我正在使用并从字符串导入URL: url_type $ fromJust $ importURL "https://google.com/" Absolute (Host {protocol = HTTP True, host = "google.com", port = Nothing}) 现在要获取主机,我可以进行模式匹配并使用主机功能: url' :: URLType -> Host url' (Absolute host) = host
url_type $ fromJust $ importURL "https://google.com/"
Absolute (Host {protocol = HTTP True, host = "google.com", port = Nothing})
现在要获取主机,我可以进行模式匹配并使用主机功能:
url' :: URLType -> Host
url' (Absolute host) = host
host $ url' $ url_type $ fromJust $ importURL "https://google.com"
这当然可行,但URLType的定义如下:
data URLType
= Absolute Host
| HostRelative
| PathRelative
在url'
函数中,只考虑绝对主机
,如果url是HostRelative
或PathRelative
,则该函数将失败。我如何制作一个url'
函数来提取主机(无论是否给定)?原始答案
我想你所需要的就是让你的url'
成为一个一元函数,它返回一个可能的主机
,用返回
组合url\u类型
,以生成另一个返回一个单子
的一元函数(在这个特定的用法中碰巧也是一个可能
),然后使用>=
运算符生成一元链:
import Network.URL
导入数据。可能(fromJust)
url'::URLType->可能是主机
url'(绝对主机)=仅主机
url'\=无
输出::可能是主机
输出=输入“https://google.com“>>=返回。url\u type>>=url'
请注意,输出
是一个可能的主机
。如果您接受整个操作可能失败,则无法获得主机。如果您可以假设操作不会失败,那么您可以从just中选择,但如果是这种情况,我相信您会问这个问题
改善
在注释中指出,>>返回。url\u类型
有点粗略。我是哈斯克尔的新手,所以我首先想到的就是我写的东西。我之所以选择单子风格,可能是因为我一直在玩和看单子的例子,而不是应用程序。另外,我还是Haskell的新手,可以很舒服地同时使用函数式、应用式和一元式风格:我只是没有想到按照评论中的建议写这个表达,因为我觉得我的表达还行。下面我根据自己的知识“重新调整”了评论
有点难看的是部件importur“https://google.com“>>=返回。url\u type
,因为运算符>=
,其类型通常为Monad m=>ma->(a->mb)->mb
,正在“强制”其第二个参数返回Monad
,即使“wannabe”第二个参数url\u type
不返回,因此,我们不得不用return
来撰写它,以尊重签名的a->mb
部分。我们真正希望的是,在importur“bla”
提供的monad中发送url\u type
,在该内部操作,并将结果留在monad中;i、 实际上,我们只需要使用importur“bla”
作为Functor
(它是这样的,因为它是单子
)。那我们怎么做呢?我们通过fmap
实现:
output=(fmap url_type$importur)https://google.com“”>>=url'
我必须使用$
来防止fmap
急切地吞下importur
,从而使字符串不受影响。我们还没有完成:fmap
有一个中缀等价物,
(请注意,$
和
之间没有任何关系),因此我们可以将上述内容重写为
output=url\u类型导入”https://google.com“>>=url”
在这一点上,我会说,我们有一个比以前更丑陋的表达式,中间输入。但是=
=)
,因此我们可以翻转两个操作数,从而获得注释中建议的表达式:
output=url'=AHostRelative
没有主机,这通常是如果您有一个指向/foo
的链接,其中主机是从上一个链接中获取的。因此,我可以推断url将始终包含主机名,并保持函数的原样吗?不,如果是绝对值,url可以包含主机名,否则url没有主机名,因此您无法“获取”主机名。您可以创建一个函数,该函数返回一个可能主机
,从而将(绝对主机)=仅主机
,其他函数映射到无
。类似于url'::URLType->可能主机url'(绝对主机)=Just host url'HostRelative=Nothing url'PathRelative=Nothing
然后使用fromJust
获取主机?不,不是fromJust
,使用Maybe
的想法是可能没有主机,因此它基本上表示“计算可能失败”。=返回。f
有点恶心。我的建议是url'=@amalloy,谢谢你的建议。我已经通过引导读者从我的粗略版本到你的版本来改进我的答案,接下来(我希望)进行了一系列合理的编辑。感谢您在评论之后花时间更新答案。这里有很多东西要学。@KarolKarol,听到这个消息很高兴:)