[英]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.