Я пишу 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
, чтобы определить, является ли число треугольным. Я понимаю, что упражнение носит чисто академический характер, я просто пытаюсь узнать о композиции функций и в основном в основном.
Я близко, играю с 'ghci' в течение нескольких минут, чтобы попытаться его обработать, но я не получаю многого. Я допустил ошибку в композиции? Я чувствую, что мне нужен знак доллара или какой-то период. EDIT: Да, положите период между isSquare и лямбдой! –
@capncoolio: Да, это знакомое чувство необходимости _just_ еще один знак доллара или период (или, может быть, это «fmap» или «flip» или ...) где-то здесь .... Анекдоты обособленно, вы должны сидеть и думать, что-то о разных ** типах **. Это ключ к тому, чтобы пройти этот этап неопределенности. Спросите себя, какой тип каждой вещи есть в вашей программе. Еще лучше, спросите ghci (': t thing' дает тип« вещи »). Теперь спросите, для каждой вещи, которая не может проверить тип (где ghci вызывает ошибку), * почему * он терпит неудачу. Как сказал Евклид: «В Хаскелл нет королевской дороги». –
Вы не будете делать плохо, если начнете с моего первого вопроса. * Рисунок * почему ': t (isSquare (\ n -> (8 * n + 1)))' приводит к сообщению об ошибке. Это помогает, если вы посмотрите на типы каждого из двух выражений, участвующих в этом. –