2014-10-05 1 views
1

У меня проблема в CLEAN, как я могу сделать строчную букву в строке? Я могу сделать это через массив символов, но мне тоже нужно сделать это с помощью строки. У меня есть код ниже до сих пор:Как записать строчку в CLEAN

module Something 

import StdEnv, StdLib 

arrayLower:: [Char] -> [Char] 
arrayLower[x:xs] = (map toLower [x:xs]) 


stringLower:: String -> String 
stringLower_ = "" 
stringLowers = toString (arrayLower s) 

Start:: String  
Start = stringLower"SSSsss" 
+2

'String' это просто синтаксический сахар для' [Char] '. – Jubobs

+0

Я знаю, но все равно не помогает, если они были равносильны семантически, тогда код создавал бы «ssssss» – Thomas

+3

Этот вопрос отмечен правильно? На данный момент он помечен 'haskell' и' функциональное программирование'. Я не знаю Clean, но в haskell это будет 'arrayLower xs = map toLower xs', и не будет необходимости в' stringLower'. –

ответ

4

Ваш первый случай

stringLower _ = "" 

означает, что stringLower применяется к чему-либо пустая строка.
Я удивлен, что вы не получили предупреждение о избыточном втором случае.

Stringявляется массив (распакованный, так что это {#Char}), и вы говорите, что вы уже знаете, как это сделать с массивами, но ваш arrayLower определен для списков Char ([Char]), а не массивы.

Это, используя понимание массива, работает для меня:

stringLower :: String -> String 
stringLower s = {toLower c \\ c <-: s} 
+0

это все еще не work: Ошибка типа [Interleave.icl, 6, stringLower]: около карты: не может унифицировать типы: Строка [v0] – Thomas

+0

@GaborToth Как насчет этого? (Отредактировано.) – molbdnilo

+0

Я вижу, но результат все еще «» :(, complier говорит: Warning [Interleave.icl, 9, stringLower]: альтернатива никогда не будет соответствовать – Thomas

Смежные вопросы