[英]Understanding Haskell's (->)?
在學習“高級” Haskell時,我很少看到(->)
。 當我嘗試運行:t (->)
時ghci
失敗,以為有時甚至官方文檔也使用此符號。
據我可以猜測 , (->)
是在一個Hask 任何態射-基本上,任何Haskell的功能。 我假設這個想法是要修復源端點或目標端點:例如, ((->) Int)
可能意味着Int
類型的任何函數; 顯然, (Int (->))
表示Int
任何函數。
下一個假設是(->)
可能是endofunctor。 fmap
實現看似微不足道:具有類型為a
且定態為f :: a -> b
fmap
f :: a -> b
的固定終結點可以生成((->) b)
的實例。 它保留id
,但不會撕裂現有的合成:即fmap(g . f) = fmap(g) . fmap(f)
fmap(g . f) = fmap(g) . fmap(f)
。
所以我的第一個問題是:我說的對嗎?
我的第二個問題是為什么:t (->)
在ghci
失敗?
我的主要問題是,有沒有一種方法可以在真實的Haskell代碼中使用(->)
? 我是否需要啟用一些{{ #Pragma ...
擴展名? 還是僅是用於解釋概念的理論概念?
最后, 最后一個問題 。 是否存在對偶概念(<-)
?
->
是函數類型的類型構造函數。 f :: A -> B
表示“ f
是從某種類型A
到某種類型B
的函數”。
:t (->)
是錯誤,因為->
不是值,並且沒有類型; 它是一個類型(或更確切地說是類型構造函數)。 同樣, :t Maybe
和:t Int
是錯誤。
與普通運算符一樣,中綴應用程序是(咖喱)前綴應用程序的語法糖; 即就像x + y
可以寫成(+) xy
或((+) x) y
, A -> B
可以寫成(->) AB
或((->) A) B
。
((->) Int)
並不意味着“ Int
類型的任何函數”; 它是從功能類型構造Int
。 它本身不是有效的類型,但是您可以將其應用於類型以獲得有效的函數類型。 例如((->) Int) String
是從Int
到String
的函數類型。
(Int (->))
是一種錯誤; 它嘗試將Int
應用於(->)
,但Int
不接受任何參數。
(->) e
實際上是任何類型e
的Functor
(具有fmap = (.)
,即函數組合)。 它也是一個Applicative
和Monad
(相當於Reader
)。
所有這些都是標准的Haskell語法。 不需要語言擴展。
<-
在類型級別不存在。 這是保留的語法,可以在表達式中使用,例如在列表推導( [ x * 2 | x <- [0 ..] ]
)或do
塊中( do { x <- p; return (x * 2) }
) ; 它還在其他一些上下文中使用,但不在類型中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.