2011-06-12 13 views
10
import Data.List (genericLength) 

len = genericLength 

:t genericLength 
genericLength :: (Num i) => [b] -> i 
:t len 
len :: [b] -> Integer 

Neden len tipi genericLength türünden farklıdır? Buradaki amaç, genericLength için daha kısa bir takma ad kullanmaktır.Bir işlev adı için diğer ad farklı türde bir imzaya sahip. Niye ya?

Haskell'de birinci sınıf işlevler yok mu? Bir fonksiyon için başka bir isim vermemesi, aynı fonksiyona neden olur mu?

+5

bir cevap göndermek için bu konuda yeterince bilgiye sahip değiliz, ama bu [monomorfizm Kısıtlaması] ile bir ilgisi vardır eminim (http://www.haskell.org/haskellwiki/Monomorphism_restriction). Dosyanın en üstünde {- # LANGUAGE NoMonomorphismRestriction # -} 'yazarsanız, beklediğiniz gibi davranır. –

+0

+1, Monomorfizm kısıtlaması ile ilgili olduğunu söyleyen Jeffrey'ye. –

cevap

11

Burada ne görüyoruz, çünkü hiçbir argümanlarla üst seviye açıklamaları monomorf olmak bir şartı olduğunu. GHC kullanıcı kılavuzunda some discussion of the reasons for this on the Haskell wiki ve controlling this behavior hakkında bazı bilgileri bulabilirsiniz. Yani

len x = genericLength x 

> :t len 
len :: Num i => [b] -> i 

bunu bir tür imza veren yok: böylece

len :: (Num b) => [a] -> b 
len = genericLength 

Ve monomorfizm kısıtlama kapatarak vermez: Resimde olarak

, bir tartışma len vererek sorunu giderip dikkat

Bu özel durumda
{-# LANGUAGE NoMonomorphismRestriction #-} 
import Data.List (genericLength) 

len = genericLength 

> :t len 
len :: Num i => [b] -> i 

, sana da farklılık bir söylüyoruz ent tipi (yerine derleyici hatası) nedeniyle belirli tip sınıfları Integer için, bu durumda belirli türleri (için Num varsayılan varsayılan gerektiğini belirtmek kuralları varsaymak. Eğer fmap ile aynı şeyi yapıyor çalışırsanız bu olsun:

> :r 
[1 of 1] Compiling Main    (MonoTest.hs, interpreted) 

MonoTest.hs:4:5: 
    Ambiguous type variable `f0' in the constraint: 
     (Functor f0) arising from a use of `fmap' 
    Possible cause: the monomorphism restriction applied to the following: 
     f :: forall a b. (a -> b) -> f0 a -> f0 b 
     (bound at MonoTest.hs:4:1) 
    Probable fix: give these definition(s) an explicit type signature 
        or use -XNoMonomorphismRestriction 
    In the expression: fmap 
    In an equation for `f': f = fmap 
Failed, modules loaded: none. 

Sen Haskell 98 Report yılında varsaymak hakkında bilgi bulabilirsiniz. Ayrıca, GHC'nin daha çok GHCi için kullanılan genişletilmiş bir varsayılan biçimini desteklediğini (ve varsayılan olarak orada etkinleştirildiğini) ve zaman zaman insanları karıştırdığını belirteceğim.

+1

Teşekkürler, fI = fromIntegral ile aynı şeyi merak ediyordum. – gorlum0

+2

@ gorlum0: Hahahaha, monomorfizm ve öntanımlılık bu işlevi kesinlikle yapar * özellikle * yararsızdır. –

+1

Artık, GHC 7.8'den "monomorfizm kısıtlaması artık GHCi'de varsayılan olarak kapalıdır" şeklinde olmaması gerektiğini unutmayın. (Https://downloads.haskell.org/~ghc/7.8.1-rc1/docs/html/users_guide/release-7-8-1.html) – thoferon

İlgili konular