2015-03-11 3 views
1

Я хотел бы написать функцию, которая сочетает в себе уникальное-имя в списке u с глаголом в списке v с другим уникальным именем-по и так, что я хотел бы получить 3 выхода, как это:кортежей в Haskell

[ ("fluffy", "loves", "monkey"), ("bunny", "feeds", "fluffy"), 
    ("bunny", "feeds", "monkey") ] 

Единственное, что я не знаю, как получить его так, что второе уникальное имя, которое оно дает мне, отличается от первого. Вот мой код:

let fun = [ u ++ " " ++ v ++ " " ++ u | u <- ["fluffy", "bunny", "monkey"], v <- ["eats", "feeds", "loves"]] 
let funThree = take 3 (cycle fun) 

В настоящее время мой выход таков:

["fluffy eats fluffy","fluffy feeds fluffy","fluffy loves fluffy"] 
+0

Нет, я хочу только три выхода, я хочу, чтобы он взял имя из u, объединил его с глаголом v и объединил его с РАЗЛИЧНЫМ именем из u. – Chalupa

+1

В к сожалению удаленном ответе автор предположил, что вы на самом деле создали кортеж, как вы указываете в заголовке и примере. Для этого вы измените выражение для результата понимания списка, например. 'u1 ++" "++ v ++" "++ u2' to' (u1, v, u2) '. Первый из них имеет тип '[Char]', а второй имеет тип '([Char], [Char], [Char])'. – Cirdec

+0

спасибо, этот комментарий на самом деле очень помог – Chalupa

ответ

4

Во-первых, давайте определим имена, чтобы их можно было использовать более чем один раз

> let names = ["fluffy", "bunny", "monkey"] 

Мы можем использовать names дважды в понимании списка, один раз, чтобы получить первое уникальное имя u1, и снова, чтобы получить второе имя, u2.

> let fun = [ u1 ++ " " ++ v ++ " " ++ u2 | u1 <- names, v <- ["eats", "feeds", "loves"], u2 <- names] 

В результате 27 различных строк

> fun 
["fluffy eats fluffy","fluffy eats bunny","fluffy eats monkey","fluffy feeds fluffy","fluffy feeds bunny","fluffy feeds monkey","bunny eats fluffy","bunny eats bunny","bunny eats monkey","bunny feeds fluffy","bunny feeds bunny","bunny feeds monkey","monkey eats fluffy","monkey eats bunny","monkey eats monkey","monkey feeds fluffy","monkey feeds bunny","monkey feeds monkey"] 

Если "fluffy eats fluffy" немного слишком странно, мы можем убедиться, что оба названия разные, добавив условие, u1 /= u2.

> let fun = [ u1 ++ " " ++ v ++ " " ++ u2 | u1 <- names, v <- ["eats", "feeds", "loves"], u2 <- names, u1 /= u2] 

В результате получается всего 18 различных строк.

> fun 
["fluffy eats bunny","fluffy eats monkey","fluffy feeds bunny","fluffy feeds monkey","bunny eats fluffy","bunny eats monkey","bunny feeds fluffy","bunny feeds monkey","monkey eats fluffy","monkey eats bunny","monkey feeds fluffy","monkey feeds bunny"] 
Смежные вопросы