2016-04-29 3 views
-3

У меня есть список строк (см. Ниже), как объединить эти строки в один список, содержащий одну строку.Объединить список строк в одну строку haskell

["hello","stack","overflow"] 

в

["hellostackoverflow"] 

Я просто разрешено импортировать Data.Char и Data.List

+0

Вы хотите, чтобы в результате была одна строка или список, содержащий одну строку? – Lee

+0

'concat' - если вы хотите, чтобы это в списке, используйте' return. concat' (не забывайте аннотацию типа, если вы попробуете ее в GHCi: 'return. concat $ [" hello "," stack "," overflow "] :: [String]') – Carsten

+0

@Lee Я имел в виду список, содержащий одна строка. спасибо, это сработало. Отправьте его как ответ, чтобы я мог принять его: D. – Memphis

ответ

4

Рассмотрим каждую строку в списке в виде списка символов

["hello","stack","overflow"] :: [[Char]] 

Конкатенация - это процесс объединения нескольких списков в один. Он должен иметь следующий вид:

concat :: [[a]] -> [a] 

Если вы будете иметь такую ​​функцию, вы получите половину работы. Вы ищете способ получить

["hellostackoverflow"] 

в результате конкатенации. Опять же, посмотрите на его типа:

["hellostackoverflow"] :: [[Char]] 

Это тот же тип, как вы были в начале исключением того, что есть только один элемент в списке. Итак, теперь вам нужна функция, которая помещает что-то в список. Он должен иметь тип

putToList :: a -> [a] 

После того, как вы будете иметь оба concat и putToList функции, ваше решение будет почти готово. Последнее, что вам нужно сделать, это составить его так:

myConcatenation = putToList . concat 

Я предлагаю вам использовать Hoogle для поиска существующей функции от его типа.

+0

'putToList = (: [])' – Kwarrtz

+0

@Kwarrtz - слишком низкий уровень. Лучше использовать [pure] (https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Applicative.html#v:pure) или [return] (https: //hackage.haskell. орг/пакет/база-4.8.2.0/Docs/Control-Monad.html # v: возвращение). – wowofbob

+0

Почему использование функции «низкого уровня» здесь является невыгодным? – Kwarrtz

1

Вы также можете использовать монаду списка, чтобы уменьшить список до одной строки, а затем переверните результат в список.

> [["hello", "stack", "overflow"] >>= id] 
["hellostackoverflow"] 

Предшествующее избегает явно использование Control.Monad.join:

> import Control.Monad 
> [join ["hello", "stack", "overflow"] 
["hellostackoverflow"] 
+1

'xs >> = id' и' join xs' эквивалентны 'concat xs'. Почему бесполезно усложнять простую операцию? – Kwarrtz

+0

@Kwarrtz Этот ответ показывает, как достичь цели, используя монадические свойства '[]'. Речь идет не о том, как сделать его более сложным. – wowofbob

-1

CONCAT [ "Привет", "стек", "переполнение"]

"hellostackoverflow"

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