我閱讀了許多類似的主題,但仍然不明白。所以問題是創建一個具有特定型別的函式,例如給定型別Integer-> Integer一個具有該型別的函式是\x-> x 1. 如何查找以下型別的 lambda 函式:
(((Int → a) → a) → b) → b(a -> b) -> ca → (a → a)(b -> c) -> (a -> b) -> a -> c
我通過猜測解決了 4.
\f g a -> f (g a)
lambda 之后的三個變數,f分別為 type b->c、gtypea->b和atype a。
:t \f g a -> f (g a)
我并沒有真正得到步驟,只是有 typeb->c和. 然后我猜到了順序。a->ba
對于 1. 只有一個輸入,所以應該是\f-> \g->....
uj5u.com熱心網友回復:
在實踐中解決這些練習的最佳方法之一是使用孔:寫入_要填充的孔并從 GHCi 中讀取該孔的型別
> foo :: (((Int -> a) -> a) -> b) -> b ; foo = _
* Found hole: _ :: (((Int -> a) -> a) -> b) -> b
孔是一個函式。那么讓我們使用 lambda。
> foo :: (((Int -> a) -> a) -> b) -> b ; foo = \f -> _
* Found hole: _ :: b
* Relevant bindings include
f :: ((Int -> a) -> a) -> b
孔必須有 type b。沒有更多的 lambda。我們不能創建 type 的值b,除非我們以某種方式應用f(注意列印的 type f)。
> foo :: (((Int -> a) -> a) -> b) -> b ; foo = \f -> f _
* Found hole: _ :: (Int -> a) -> a
啊,現在這個洞又是一個函式了。另一個拉姆達。
> foo :: (((Int -> a) -> a) -> b) -> b ; foo = \f -> f (\g -> _)
* Found hole: _ :: a
* Relevant bindings include
g :: Int -> a
好吧,現在我們需要生產a. 有了g :: Int -> a我們的處置,它看起來很容易。
> foo :: (((Int -> a) -> a) -> b) -> b ; foo = \f -> f (\g -> g 42)
沒有更多的洞——完成。
請注意,您的 2)(a -> b) -> c無法正確實作 - 無法c從該輸入中生成 a 。您只能使用該型別撰寫非終止(或崩潰)程式。
uj5u.com熱心網友回復:
(b -> c) -> (a -> b) -> a -> c表示具有 3 個多型引數的函式,前 2 個引數也是函式,第一個是b -> c(接受 b 并回傳 c 的函式),第二個是a -> b(接受 a 并回傳 b 的函式)(參見高階函式)。Lambda\f g a -> f (g a)有三個引數,通過g引數a傳遞給的呼叫結果來實作f。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477439.html
