9

Sadece Idris'u öğrenmeye başlıyorum ve Idris ile Tip Tahrikli Geliştirme kitabı üzerinden çalışıyorum. İkinci bölümden alınan örnek alıştırmalardan biri, bir dizgi verilen dizge içindeki bir kelimenin ortalama uzunluğunu belirleyen bir fonksiyon yazmaktır.Neden bu Idris snippet typecheck açık bir tür olmadan neden yok?

average : String -> Double 
average phrase = 
    let werds = words phrase 
     numWords = length werds 
     numChars = the Nat (sum (map length werds)) in 
    cast numChars/cast numWords 

Ancak, ben nedeniyle numChars hattına bu çözümün gelen bir sürü sorun vardı şu şekildedir: Benim çözüm oldu. Herhangi bir nedenle, the Nat'u kullanarak türünü açık bir şekilde yapmadığım sürece, bu durum yazım denetiminde değildir. Hata durumları:

Can't disambiguate since no name has a suitable type: 
     Prelude.List.length, Prelude.Strings.length 

Bu bakılmaksızın length tanımı, dönüş tipi Nat olduğu kullanıldığı Beri, bana anlamda bir sürü yapmaz. Bu, aynı işlem dizisinin REPL'de hatasız yapılabileceği gerçeği ile desteklenir. Bunun sebebi nedir?

cevap

2

Bu gerçekten garip sonra orta hesaplama map length werds isim ise İdris türünü tahmin edebiliyoruz olduğu göz önüne alındığında biridir:

average : String -> Double 
average phrase = 
    let werds = words phrase 
     numWords = length werds 
     swerds = map length werds 
     numChars = sum swerds in 
    cast numChars/cast numWords 

Ve REPL da sum . map length . wordsString -> Nat tip olduğunu anlaması yapabiliyor. Burada tatmin edici bir cevap alamıyorsanız, a bug report'u doldurmanızı tavsiye ederim.

0

Bu bir uygulama hatasıdır. İdris, İdris'in kendisinden ziyade Haskell'de yazılmıştır. Haskell'in bağımlı türleri olmadığından, hatalar daha olasıdır. Belki bir gün, Idris kendi içinde yeniden yazılacak.