2011-12-28 13 views
8

, örneğin, bir isim için bir işlev bağlamak için genellikle uygundur:Bir işlevi başka bir adama ne zaman bağlayabilirim? tercüman çalışırken

ghci> let f = (+1) 
ghci> f 1 
2 

Bu işlevin (+1) adını f Takma Adlar. Basit. Bununla birlikte, bu her zaman işe yaramamaktadır. Bir örnek, bir hata neden Data.List modülünden nub takma denemeye çalıştığını buldum. Ben açıkça x o zaman hatasız çalışır argüman devlet Örneğin,

ghci> :m Data.List 
ghci> nub [1,2,2,3,3,3] 
[1,2,3] 
ghci> let f = nub 
ghci> f [1,2,2,3,3,3] 

<interactive>:1:14: 
    No instance for (Num()) 
     arising from the literal `3' 
    Possible fix: add an instance declaration for (Num()) 
    In the expression: 3 
    In the first argument of `f', namely `[1, 2, 2, 3, ....]' 
    In the expression: f [1, 2, 2, 3, ....] 

Ancak:

ghci> let f x = nub x 
ghci> f [1,2,2,3,3,3] 
[1,2,3] 

Herkes bu davranış açıklayabilir misiniz?

+7

[Bu soru ve cevap] 'a bakın (http://stackoverflow.com/questions/4575040/what-is-xnomonomorphismrestriction). – gspr

+0

Teşekkürler. Bunu bir cevap olarak gönderdiyseniz (muhtemelen biraz genişletilmiş) kabul ediyorum. –

+1

Hayır, kredinin neden olduğu kredi (yani bağlandığım yanıt). :-) – gspr

cevap

3

Geçerli Ghci sürümlerinde varsayılan yazım kuralları, biraz anlaşılmaz.

f için bir tür imzası sağlayabilirsiniz. Veya Chris tarafından daha önce tavsiye edildiği gibi ~/.ghci dosyanıza :set -XNoMonomorphismRestriction ekleyin.

İlgili konular