Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell从URLType提取主机名_Haskell_Monads_Maybe - Fatal编程技术网

Haskell从URLType提取主机名

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:

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'=A
HostRelative
没有主机,这通常是如果您有一个指向
/foo
的链接,其中主机是从上一个链接中获取的。因此,我可以推断url将始终包含主机名,并保持函数的原样吗?不,如果是
绝对值,url可以包含主机名,否则url没有主机名,因此您无法“获取”主机名。您可以创建一个函数,该函数返回一个
可能主机
,从而将
(绝对主机)=仅主机
,其他函数映射到
。类似于
url'::URLType->可能主机url'(绝对主机)=Just host url'HostRelative=Nothing url'PathRelative=Nothing
然后使用
fromJust
获取主机?不,不是
fromJust
,使用
Maybe
的想法是可能没有主机,因此它基本上表示“计算可能失败”。
=返回。f
有点恶心。我的建议是
url'=@amalloy,谢谢你的建议。我已经通过引导读者从我的粗略版本到你的版本来改进我的答案,接下来(我希望)进行了一系列合理的编辑。感谢您在评论之后花时间更新答案。这里有很多东西要学。@KarolKarol,听到这个消息很高兴:)