2016-06-18 12 views
9

Bu gerçekten de noobish bir soru olabilir, ancak bu sorunu atlayamıyorum (sadece Haskell'i öğrenmeye başladığımdan). Ben alıyorum nedenBeklenen tür "Metin" ile eşleştirilemedi Gerçek tipi "[Char] '

<interactive>:108:19: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the first argument of `Data.Text.replace', namely `"ofo"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

<interactive>:108:25: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the second argument of `Data.Text.replace', namely `"bar"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

<interactive>:108:31: error: 
* Couldn't match expected type `Text' with actual type `[Char]' 
* In the third argument of `Data.Text.replace', namely `"ofofo"' 
    In the expression: Data.Text.replace "ofo" "bar" "ofofo" 
    In an equation for `it': it = Data.Text.replace "ofo" "bar" "ofofo" 

Bilmiyorum: Ben str ile bu ararsanız

module SomeTest where 
import Data.Text 

str = replace "ofo" "bar" "ofofo" 

, alıyorum:

Ben basit bir kod bloğu var Bu hata ve nasıl geçilir. Text [Char] için bir eş anlamlı değil mi?

+0

Hayır, 'Metin 'tamamen farklı bir türüdür. 'String' ise 'Char'' ile eşanlamlıdır. – melpomene

+2

Ne yazık ki, Haskell karakter dizileri için çeşitli çakışan türleri vardır. Sizin durumunuzda, programınızın ilk satırı olarak '{- # LANGUAGE Aşırı Yüklenenİlerleme Sayısı - -}' nı derlemek, derlemesini sağlamalıdır. – stholzm

+0

Teşekkürler, bu gerçekten işe yaradı. Lütfen bu yorumdan bir cevap verin ve kabul edeceğim. –

cevap

18

Ne yazık ki, Haskell karakter dizileri için çeşitli çakışan türleri vardır. Dize hazırlıkları genellikle [Char] için bir diğer ad olan String türündedir. Bu dizelerin verimsiz bir temsili olduğundan, Text gibi alternatifler vardır. Sizin durumunuzda, programınızın ilk satırı olarak {-# LANGUAGE OverloadedStrings #-} eklendiğinde, derlenmesini sağlayabilirsiniz. Temel olarak, dize değişmezleriniz daha sonra Text türünde olabilir.

+12

'Aşırı Yüklenen Diziler ', tüm dize değişmezlerini" foo "" öğesini "fromString" foo "' ye çevirir. ['fromString'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-String.html#v:fromString)' String'den herhangi bir örneğe dönüşebilen bir yöntemdir. "Metin" gibi "IsString" sınıfı. – melpomene

+0

Teşekkür ederim :) başka harika bir bilgi. –

+4

Bu işe yaramakla birlikte, belirsiz türlerle ilgili daha karmaşık hatalar da alabilirsiniz; çünkü GHC hangi tür "IsString" in kullanılması gerektiğini belirleyemez. Bunlar genellikle "bazı metinler" ("bazı metinler" :: Metin) 'e dönüştürülerek çözülebilir. –

İlgili konular