【问题标题】:Haskell - How to write twice function using (.) f g - function compositionHaskell - 如何使用 (.) f g 编写两次函数 - 函数组合
【发布时间】:2014-09-22 04:09:02
【问题描述】:

这就是问题所在,我需要编写众所周知的两次函数

(twice= \x-> \x-> x) 

但这次使用(.) 组合函数,如(.) f g

我不知道怎么解决,因为我一开始以为是这样的:

(.) f g = (\x -> f (g x)) 

(g = f) 会是这样的

(.) f f = (\x -> f (f x))

但我有一个

“'f' 的定义冲突”

在 GHCI 上运行

那么,有什么建议吗?

【问题讨论】:

  • 我认为你还没有 Haskell 的基本语法(还)——这似乎是 lambda-calculus 和 Haskellish 语法之间的混合——也许你可以写更多关于这是从哪里来的。与此同时,你可以看看我的回答,看看我会如何假设twice 并“解决”它
  • 好吧,事情就是这样,我实际上正在学习一门新课程,它被称为“计算基础”,就像你提到的 lambda-calculus 和 Haskell 语言的混合。他们试图教这两件事。我的两次将函数 f 两次应用于争论 x。然后他们要求我解决问题,但这次使用 (.) 组合函数。你提到的这对我来说非常困难:他们一直混合使用 Haskell 和 lambda-calculus。
  • 确实很容易如果你得到你的twice正确
  • 在我看来,同一个问题的两个变体 - 当这两个函数可能相同时,如何定义两个函数的组合。

标签: haskell math lambda lambda-calculus


【解决方案1】:

除了解析输入之外,我不知道您是如何得到任何其他信息的:

(.) f f = (\x -> f (f x))

但是您给出的定义:twice = \x -> \x -> x 与使用“两次”无关 - 实际上,如果您插入一些值:

twice a b
= (\x -> \x -> x) a b 
= (\x -> (\x -> x)) a b -- (rename the inner x)
= (\x -> (\y -> y)) a b
= ((\x -> (\y -> y)) a) b
= (\y -> y) b
= b

GHCi 确实会告诉你同样的情况:

> let twice = \x -> \x -> x
> :t twice
twice :: t -> t1 -> t1
> twice "a" "b"
"b"

现在我猜你想要这样的东西:

let twice f x = f (f x)

例如:

> let twice f x = f (f x)
> twice (+1) 5
7

如您所见,twice (+1) 加 2(或加 2)。

现在你如何使用(.) 做到这一点? - 你的直觉是正确的:

> let twice f = f . f
> twice (+1) 5
7

关于模块

正如您要求的模块 - 这可以在我的系统上正常编译(并加载到 GHCi):

module Twice where

twice :: (a->a) -> a -> a
twice f = f . f

备注:

仅当您在前奏(或 GHC.Base)中包含 (.) 时才有效-我怀疑您进行了某种隐藏前奏的练习-在这种情况下,您必须首先为自己定义 (.)(很可能是另一个练习)

如果需要自己实现:

(.) :: (b -> c) -> (a -> b) -> a -> c
(.) g f x = g (f x)

【讨论】:

  • 我的两次是这个:两次:: (a -> a) -> a -> a 两次= \x-> \x-> x。并且工作正常,因为探测它做了两次不是 False = False,我的意思是两次不是 False = 不是不是 False = False。所以现在我需要写两次这个版本,但使用(。)符号,我希望更清楚,谢谢你的回答。
  • err - no ...尝试将您的函数与twice (+1) 0一起使用,它会产生0(我什至向您展示了原因)
  • 它适用于您的示例只是因为“not .not == id”所以您认为您的定义很好,因为它是第二个参数的标识。你可以说有问题,因为你从来没有使用你在那里给出的第一个参数(为什么你可能会问?好吧,因为你用第一个x第二个\x -> x
  • 好的,我明白了这一点,你好吧,它必须是:两次 f x = f (f x)。但另一个问题是,当我保存它时,另一个符号:两次 f = f 。 f - GHCI 告诉我“不在范围内:`.'”还有其他建议吗?
  • 试试let twice f = f . f ^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多