我嘗試了一個使用帶有 lambda 運算式的組合的虛擬示例。下面的代碼編譯,但是當我嘗試時它沒有運行(f.g) 3 2
f x = x^2
g x = 5*x
f.g = \x -> f(g x)
它給出了這樣的錯誤:
Ambiguous occurrence `.'
It could refer to
either `Prelude..',
imported from `Prelude' at list3.hs:1:1
(and originally defined in `GHC.Base')
or `Main..', defined at list3.hs:42:3.
有人可以告訴我問題出在哪里嗎?
uj5u.com熱心網友回復:
您定義了與從 Prelude 匯入的組合運算子一起存在的組合運算子。定義沒有錯;當您嘗試使用它時會出現問題,因為編譯器無法判斷類似
main = print $ f . g $ 10
應該.從 Prelude 或.您的Main模塊中使用。
一種解決方案是簡單地明確您想要兩者中的哪一個。
f . g = \x -> f (g x)
main = print $ f Main.. g $ 10
或者首先不匯入 Prelude 版本。
{-# LANGUAGE NoImplicitPrelude #-}
import Prelude hiding ((.))
-- Now this is the *only* definition.
f . g = \x -> f (g x)
main = print $ f . g $ 10
uj5u.com熱心網友回復:
正如 chepner 的出色回答中所解釋的那樣,您的“。” 點運算子與常規的 '.' 沖突 從 Haskell Prelude 隱式匯入的運算子。這就是錯誤訊息的含義。
幸運的是, Haskell 編譯器支持Unicode字符集,它恰好提供了數學書籍中所見的正確的函陣列合字符,即 '°',十進制位置 8728。
而這個“°”運算子(到目前為止)還沒有被 Prelude 定義。
因此,以下代碼可以正常作業:
main :: IO ()
main = do
let
-- our own function composition operator:
fna ° fnb = \x -> fna (fnb x) -- Unicode character #8728 (decimal)
f x = x * x
g x = 5 * x
h = f ° g -- composed function
res = h 7
putStrLn $ "res = " (show res)
如您所料,它會列印出 1225 的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474036.html
