Просто и точка в winghci

Почему это работает...

Just.(+3) $ 6.7
Just $ truncate 8.9

... но не это?

Just.truncate $ 8.9

Я попытался разрешить усечение до простого Double -> Int:

let f :: Double -> Int; f = (\ x -> truncate x);

... но это не проблема...

Just.f $ 5.6

<interactive>:41:1:
Failed to load interface for `Just'
Use -v to see a list of the files searched for.

Большое спасибо!

2 ответа

Решение

Когда вы хотите сочинять функции, лучше написать f . g чем f.g, Это немного более читабельно, и вы избежите кучу таких проблем, как эта.

Когда у вас есть что-то в форме Foo.bar или же Foo.Bar в Haskell он анализируется как квалифицированное имя. Вот почему Just.f не работает: Just не является модулем, поэтому "интерфейс" для Just не может быть загружен.

Зачем Just.(+3) работает как задумано: (+3) является правильным разделом, а не идентификатором, поэтому точка не может быть частью определенного имени. Единственный способ интерпретировать это - предположить, что . это инфиксное приложение оператора (.)так должно быть Just . (+3),

Точка между заглавными и другими идентификаторами анализируется как квалифицированное имя (например, Data.Map.insert), поэтому ошибка говорит вам, что он не может найти модуль с именем Just, Вы можете просто добавить пробелы вокруг точки, чтобы это исправить.

Другие вопросы по тегам