簡體   English   中英

Haskell-如何使用(。)fg編寫兩次函數-函數組成

[英]Haskell - How to write twice function using (.) f g - function composition

這是問題,我需要編寫眾所周知的兩次函數

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

但是這次使用(.)等組成函數(.) fg

我不知道該怎么解決,因為我一開始就想這樣做:

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

(g = f)一樣

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

但我有一個

“'f'的定義有沖突”

在GHCI上運行

那么,有什么建議嗎?

我不知道除了解析輸入之外,您還得到了什么:

(.) 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(或一次兩次)。

現在如何使用(.)完成此操作? -你的直覺很不錯:

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

關於模塊

如您所要求的模塊-這可以在我的系統上正常編譯(並加載到GHCi中):

module Twice where

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

備注:

僅當您在前奏(或GHC.Base)中包含(.) ,此方法才起作用-我懷疑您隱藏了前奏的某種鍛煉方式-在這種情況下,您必須首先為自己定義(.) (很可能是另一個鍛煉; Tibial)

如果您需要自己實施:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM