首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell的\x -> (x,x)等价于join (,)的派生是什么?

Haskell的\x -> (x,x)等价于join (,)的派生是什么?
EN

Stack Overflow用户
提问于 2015-04-18 05:45:56
回答 2查看 496关注 0票数 21

根据pointfree

代码语言:javascript
运行
复制
\x -> (x, x)

相当于:

代码语言:javascript
运行
复制
join (,)

说明这一点的推导是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-18 05:58:10

查看类型签名:

代码语言:javascript
运行
复制
\x -> (x, x) :: a -> (a, a)

(,)          :: a -> b -> (a, b)

join         :: Monad m => m (m a) -> m a

应该注意的是,((->) r)Monad类型的一个实例。因此,关于专门性:

代码语言:javascript
运行
复制
join         :: (r -> r -> a) -> (r -> a)

join对函数的作用是将给定的函数两次应用于同一个参数:

代码语言:javascript
运行
复制
join f x = f x x

-- or

join f = \x -> f x x

从这一点上,我们可以看到:

代码语言:javascript
运行
复制
join (,) = \x -> (,) x x

-- or

join (,) = \x -> (x, x)

Qed。

票数 30
EN

Stack Overflow用户

发布于 2015-04-18 08:52:31

我喜欢Aadit直观的答案。下面是我通过阅读源代码来解决这个问题的方法。

  1. 我去Hoogle
  2. 我搜索join
  3. I join
  4. 我点击“源”按钮进入join
  5. 我看到join x = x >>= id
  6. 所以我知道join (,) = (,) >>= id
  7. I on Hoogle and click the link
  8. 我看到这是单打类型的一部分,我知道我在处理(,),这是一个函数,所以我 instance
  9. 我看到f >>= k = \r -> k (f r) r
  10. 因为我们有f = (,)k = id,所以我们得到了\r -> id ((,) r) r
  11. 哇哦..。新功能!id!我在Hoogle和click through to its source code上搜索
  12. 原来是id x = x
  13. 所以,我们现在没有join (,),而是\r -> ((,) r) r
  14. 这和\r -> (,) r r是一样的
  15. 这和\r -> (r,r)是一样的

永远不要忘记Haddocks链接到库的源代码。在试图找出事物是如何一起工作的时候,这是非常有用的。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29713442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档