2012-09-29 18 views
17

Haskell'de import Fruit veya import Fruit (apple) yazıp apple veya Fruit.apple'a erişebilir.Haskell'de bir takma adla işlev alma

Python'da, apple için from Fruit import apple veya için Fruit.apple için yazabilirim.

Ayrıca, banana ile aynı işlevi referans olarak Python'da import Fruit.apple as banana yazabilirim.

Haskell'de bunu nasıl yapabilirim? Her iki dilde de import Fruit as Vegetable, Fruit'i yeniden adlandırabilir, ancak elmaları yeniden adlandırmak istiyorum.

+0

, ben özellikle olduğum gider Refactoring olmadan Int kurtulmak. –

+0

Aşağıdaki sözdizimini kabul etmek için GHC'yi yamalamak ne kadar kolay ya da zor olurdu: 'İthalat Meyve (elma muz gibi). – Wizek

cevap

17

Bu güzel bir özelliktir Python çünkü "sözlükleri tüm yol aşağı," konuşmak için. Haskell, takma adlara modül atamanıza izin verir, ancak (import) deyiminden (bildiğim kadarıyla) diğer ad işlevlerini kullanmanın bir yolu yoktur. Tek yapmanız mümkün olacaktır iyi

import qualified Fruit as F (apple) 
banana = F.apple 

Tüm bunların ayrıntılarını gizleme, kendi modülünde bu koymak ve istediğiniz değerleri dışa olabilir, ama o kadar basit bir şey için işin çok gibi görünüyor . Aşağıda, hammar tarafından yorumlandığı gibi, monomorfizm kısıtlaması, 'un banana ile sorun yaratabilir. Emin olmak için, ya istenen türüyle (apple muhtemelen o) banana açıklama ya Aksi

{-# LANGUAGE NoMonomorphismRestriction #-} 
import qualified Fruit as F (apple) 
banana = F.apple 

olarak monomorfizm kısıtlama devre dışı bırakması gerekir, banana ait çıkarsama yoluyla tip istenenden daha az polimorfik olabilir.

Monomorfizm kısıtlaması, her bir üst seviye işlevi için bir tür sınıfının somut bir örneğini atamaya çalışır (bu, performans nedenleriyle yapılır).

example = return() 

Bu fonksiyon tipini Monad m => m() var, ama monomorfizm kısıtlaması nedeniyle, Monad örneği kullanılması gerektiğini hakkında yeterli bilgi yoktur gerektiğini düşünün siz

Ambiguous type variable `m0' in the constraint: 
    (Monad m0) arising from a use of `return' 
Possible cause: the monomorphism restriction applied to the following: 
    example :: m0() (bound at Test.hs:44:1) 
Probable fix: give these definition(s) an explicit type signature 
       or use -XNoMonomorphismRestriction 
In the expression: return() 
In an equation for `example': example = return() 

Şimdi şu mesajı almak böylece , sen GHC kullandığınız Monad hangi örneği anlaması için yeterli bilgi, sağlarsanız gibi

example = return() 

main :: IO() 
main = example 

sonra GHC follo verecek kanat tipi

*Main> :t example 
example :: IO() 

Eğer example doğrudan Buna hiç sözdizimi var main

+2

Bu 'banana = F.apple' değil mi? – Artyom

+0

@ArtyomKazak Evet öyle! – sabauma

+8

Bunu yaparken monomorfizm kısıtlamasına karşı dikkatli olun, ya da "muz", "elma" dan daha kısıtlayıcı bir türle sonuçlanabilir. – hammar

7

olarak aynı tip olacak o kadar anlattı beri. Muhtemelen bir apple yerel olarak tanımlanmış olan bir çatışma önlemek için istiyorum, bu yüzden uzunluğu elde etmek olarak Data.List.genericLength içe çalışıyor şu anda Bilgin

import qualified Fruit (apple) 
banana = Fruit.apple