2011-12-19 32 views
6

Haskell'in bir şeyi özel bir tür olarak yorumlamasını nasıl söyleyebilirim? Örneğin, ben bir liste var ve bir kullanımından doğan bu hatayıHaskell: "Döküm"/kuvvet tipi?

(Fraksiyonel Int) için örnek yüzden

(length mylist)/2 

yazma 2. tarafından uzunluğunu bölmek ve almak istiyorum Ben bütün bir sayı bölünmesini istemek gibi ben length mylist, 2 ve sonuç Int yapmak istiyorum '/'

arasında.

+0

JFI, 'Data.List' içinde' genericLength' işlevi var. Sizin durumunuzda, tam sayı cevabı geri gelmeyecektir, ancak genellikle 'garip' 'konuşan' 'çağrılardan kaçınmanıza izin verdiği için yararlıdır. –

+0

Daha fazla 'fromIntegral' gerektirir. Ciddi olarak, 'FromIntegral', 'Num' tipeclass'ını başlatan her şeye bir "int" eklemenin sihirli bir yoludur. –

cevap

11

Burada iki farklı sorun var.

  • tamsayı bölümü: div (length mylist) 2 veya (length mylist) `div` 2

  • Döküm: div işlevini kullanın. Haskell'e, sadece expression yerine expression :: type yazarak belirli bir ifadenin belirli bir türe sahip olduğunu söyleyebiliriz. Bununla birlikte, bu değerlerin "döküm" veya "dönüşüm" yapmaz. Çeşitli sayısal ve dize türleri arasında dönüştürme için bazı yararlı işlevler fromIntegral, show, read, realToFrac, fromRational, toRational, toInteger ve diğerleridir. Bunları Hoogle'da görebilirsiniz.

5

div (length my list) 2 ürününü deneyin. / kesirli bölüm yapar; div tam sayı bölüştürücüdür.

+0

Ah, teşekkürler. Ve genel olarak nasıl yapılır? Her zaman işlev tipi tanımına uymak zorunda mısın? – user905686

+0

Bir türden diğerine (tamsayı kesirliye kadar) dönüştürmenize izin veren işlevler vardır, ancak evet, Haskell'in doğası, türlerin bir işlev tanımına uymaması durumunda, siz * * bir hata alacak. – mipadi