2015-04-15 3 views
0

Я пишу Haskell, целью которого является получение списка чисел и фильтрация любого числа, которое не является треугольным.Реализация фильтра, функция которого принимает аргумент

main :: IO() 
main = do 
    interact tri 

tri :: String -> String 
tri = unwords . 
     map show . 
     filter (isSquare (\n -> (8*n+1))) . 
     map (read :: String -> Int) . 
     words 

isSquare :: (Integral a) => a -> Bool 
isSquare n = (round . sqrt $ fromIntegral n)^2 == n 

Это то, что у меня есть до сих пор. Там, где у меня возникают проблемы, это фильтр.

Я не совсем понимаю, как я мог бы на самом деле получить доступ к значениям этой анонимной функции (или, если это вообще возможно, если это возможно). Мне нужно проверить каждый номер, используя эту функцию, в сочетании с isSquare, чтобы определить, является ли число треугольным. Я понимаю, что упражнение носит чисто академический характер, я просто пытаюсь узнать о композиции функций и в основном в основном.

ответ

3
  1. Имеет ли выражение (isSquare (\n -> (8*n+1))) тип-проверка? Почему нет?

  2. filter имеет тип (a -> Bool) -> [a] -> [a]. Поэтому его первый аргумент должен быть функцией типа (a -> Bool). Вы почти там с этим; какую функцию вы хотите здесь, и как вы можете построить ее с тем, что у вас есть? Подсказка: это односимвольное изменение.

+0

Я близко, играю с 'ghci' в течение нескольких минут, чтобы попытаться его обработать, но я не получаю многого. Я допустил ошибку в композиции? Я чувствую, что мне нужен знак доллара или какой-то период. EDIT: Да, положите период между isSquare и лямбдой! –

+1

@capncoolio: Да, это знакомое чувство необходимости _just_ еще один знак доллара или период (или, может быть, это «fmap» или «flip» или ...) где-то здесь .... Анекдоты обособленно, вы должны сидеть и думать, что-то о разных ** типах **. Это ключ к тому, чтобы пройти этот этап неопределенности. Спросите себя, какой тип каждой вещи есть в вашей программе. Еще лучше, спросите ghci (': t thing' дает тип« вещи »). Теперь спросите, для каждой вещи, которая не может проверить тип (где ghci вызывает ошибку), * почему * он терпит неудачу. Как сказал Евклид: «В Хаскелл нет королевской дороги». –

+0

Вы не будете делать плохо, если начнете с моего первого вопроса. * Рисунок * почему ': t (isSquare (\ n -> (8 * n + 1)))' приводит к сообщению об ошибке. Это помогает, если вы посмотрите на типы каждого из двух выражений, участвующих в этом. –

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