【问题标题】:S combinator in HaskellHaskell中的S组合器
【发布时间】:2014-05-30 11:40:50
【问题描述】:

S combinator 的模拟是否可以在 Haskell 中仅使用标准函数(不通过方程定义)而不使用 lambda(匿名函数)来表示?我希望它的类型为(a -> b -> c) -> (a -> b) -> a -> c

例如,K 组合子的模拟就是const

事实上,我正在尝试使用标准函数来表达函数\f x -> f x x,但想不出任何标准的非线性函数可以开始(即多次使用其参数的函数)。

【问题讨论】:

  • \f x -> f x x 在函数 monad 中是 join
  • blogged 关于我注意到 SK 组合演算和应用函子之间的一个链接,并从读者那里得到了一些您可能想要查看的有趣的 cmets。更多有趣的 cmets 也可查看this answer
  • 什么是标准函数?
  • @duplode 我想知道这是否算作通过方程式定义它
  • @SassaNF,我的意思是任何相当标准的东西,比如(.)($),可能是flip :)。

标签: haskell combinators s-combinator


【解决方案1】:

s = (<*>) 用于 ((->) r) Applicative 实例。

【讨论】:

  • 抱歉,((->) r) 是什么?
  • @Alexey 是所有类型r ->。不幸的是,您不能像使用普通运算符那样使用类型运算符来执行部分。因此,尽管您可以执行 (10*) 之类的操作,但这不是有效的 Haskell (r ->)。幸运的是,我们确实有一个语法可以给我们一个等效的结果:((->) r)。但是请注意,我们不能对第二个参数做同样的事情。这实际上是故意禁止的(我认为在某些情况下它使类型推断变得不可能),这就是为什么我们不能有类型运算符部分。
  • @Alexey 所以,如果我们有一个类型同义词type Function a b = a -> b,那么((->) r) 等价于Function r
  • 那么,r 只是一个类型变量?
  • 不可能有像(-> Int) 这样的东西,是因为 Haskell 不允许逆变函子吗?
【解决方案2】:

虽然一开始看起来不像,ap 是 S 组合器(join 是你真正想要的组合器)。

【讨论】:

  • 谢谢,这很有帮助。我想我会接受另一个答案,但是因为我的问题的标题,而且Applicative 似乎比Monad 更笼统。
  • 事实上,也许MonadApplicative 更严格,你的回答其实更好
【解决方案3】:

也可以使用(=<<), (>>=)

它们都包含在前奏曲中

instance Monad ((->) r) where  
    return = const
    f >>= k = \ r -> k (f r) r  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多