2016-08-14 1 views
0

Я собираюсь узнать вас, Haskell. У меня есть следующая функция:Haskell получает строку из понимания списка

bmiTell :: (RealFloat a) => a -> a-> String 
bmiTell weight height 
    | bmi <= skinny ="underweight" 
    | bmi <= normal = "ok" 
    | bmi <= fat = "fat" 
    | otherwise = "whale" 
    where 
    bmi = weight/height^2 
    (skinny,normal,fat)=(18.5, 25.0,30.0) 

который работает отлично. Я теперь делает список понимание, где желаемый результат что-то вроде этого:

[(68, "пониженный"), (69, "хорошо"), (70, "хорошо")]

это мой GHCi вход:

[(x,y)| x <-[68..70], y <- bmiTell x 185] 

и выход

[(68,0, 'и'), (68.0, 'п'), (68,0,» г '), (68.0,' е '), (68.0 , 'Г'), (68.0, 'W'), (68.0, 'е'), (68.0, 'я'), (68.0, 'г'), (68.0, 'Н'), (68.0,» г '), (69.0' и '), (69,0,' п '), (69,0,' d '), (69,0,' е '), (69,0,' г '), (69,0,' W»), (69,0, 'е'), (69,0, 'я'), (69,0, 'г'), (69,0, 'Н'), (69,0, 'т'), (70.0 'и'), (70,0, 'п'), (70.0, 'd'), (70.0, 'е'), (70.0, 'г'), (70.0, 'W'), (70.0, 'е'), (70.0 , 'я'), (70.0, 'г'), (70.0, 'Н'), (70.0, 'т')]

Я попытался что делает его (х, [у]), но Я получаю тот же результат с Chars в «» с вместо одинарных кавычек

+1

Просто используйте '[(x, bmiTell x 185) | x <- [68..70]] ' – ErikR

+0

Действительно, спасибо, могу я ответить на ваш вопрос? * so embarassed * – justice

+0

Поместите bmiTell X 185 в список [bmiTell X 185], и ваш должен работать. Помните, что строки - это списки. Понимание было pull} ng из единственного найденного списка. Кроме того, два генератора в понимании являются aXb или декартовыми – fpmora

ответ

3

Вы можете просто использовать map функции:

map (\w -> (w, bmiTell w 185)) [68..70] 

Или как @ErikR упомянул, используя список:

[ (x, bmiTell x 185) | x <- [68..70] ] 

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

  • Нет связанных вопросов^_^