我写了一小部分Haskell来弄清楚GHC如何证明对于自然数,你只能将偶数的一半:
{-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-}
module Nat where
data Nat = Z | S Nat
data Parity = Even | Odd
type family Flip (x :: Parity) :: Parity where
  Flip Even = Odd
  Flip Odd  = Even
data ParNat :: Parity -> * where
  PZ :: ParNat Even
  PS :: (x ~ Flip y, y ~ Flip x) => ParNat x -> ParNat (Flip x)
halve :: ParNat Even -> Nat
halve PZ     = Z
halve …我的haskell应用程序具有以下目录结构:
src/
    utils/Utils.hs
    subsystem/Subsystem.hs
该Subsystem模块导入Utils模块.我想在GHCi中手动测试这段代码.
问题是GHCi似乎只是在'.'(当前目录)中寻找可用的模块,所以我复制Utils.hs到子系统文件夹并且能够进行手工测试Subsytem.hs.有一个更好的方法吗?例如,我想在src目录中启动GHCi ,让它搜索模块./utils和./subsystem目录.我可以指定GHCi的模块路径吗?
我写了一个Haskell程序,它在列表上执行二进制搜索.至少这就是我的想法.当我用程序编译程序ghc v7.6.3并运行程序时,我得到了以下输出:
progname: <<loop>>
这个输出究竟意味着什么?这是否意味着我有一个无限循环ghc优化了?我该怎么调试呢?
假设我想完全重新安装GHC/HP.我想(尽可能多的迷信)删除以前的安装中的任何东西.我实际需要删除什么(以及在哪里)?
编辑:我在OSX上,但是如果这些信息一般适用于所有系统,我会更好奇.
编辑2:到目前为止,我们有:
OSX:
/Library/Frameworks/GHC.framework/ 
〜/ .cabal/
在/ usr/bin中/ -符号链接
我将添加(基于此处定义的"前缀":http://www.vex.net/~trebla/haskell/sicp.xhtml#storage):
前缀/ lib/
前缀/共享/ 
前缀/ bin/
前缀/ share/doc/
/ usr(/ local)/ lib/[ghc-version] 
/ usr(/ local)/ share/doc/ghc/html/libraries/ -  documentation 
/ usr(/ local)/ share/doc/ghc/
/ usr(/ local)/ bin 
/ var/lib/[ghc-version] 
/ etc/[ghc-version] 
〜/ .ghc /
编辑3:
OS X:
〜/ Library/Haskell  
Linux:
??  
Windows:
??  
制作一个三元逻辑表,我想为我将调用的运算符创建自己的函数<=>.  
所以,例如,我想这样做,但那是不对的.这样做的正确方法是什么?
data Ternary = T | F | M
deriving (Eq,  Show, Ord)
<=> :: Ternary -> Ternary -> Ternary
<=> T F = F
<=> T T = T
<=> T M = M
<=> F F = T
<=> F T = F
<=> F M = M
<=> M F = M
<=> M T = M
<=> M M = T
升级到OSX Mavericks后,为什么我的GHC 7.6.3不起作用?
Haskell平台包括两个过时的库,old-time和old-locale.对于旧时,它还包括首选替代方案(即time),但我无法弄清楚推荐的替代方案old-locale是什么.
这仅仅是截至目前的平台(版本2010.1.0.0)的缺点,还是我忽略的东西?
我想知道我应该知道哪些库,函数和概念以及如何使用.Monad和那里的函数是典型的例子,但是在编码中还有其他好的原语,比如Arrows,Applicative,......他们是谁?
顺便说一下,我想在Haskell世界中了解最新情况,学习新概念,这是怎么做到的?
(最初的标题是:"用于编码的库原语",但这已被更改)
在haskell平台的许多功能的实现中有一个非常常见的模式困扰我,但我无法找到解释.它是关于使用嵌套函数进行优化的.
嵌套函数在where子句用于进行尾递归的原因对我来说非常清楚(如长度),但内部函数与顶级函数具有完全相同类型的目的是什么?例如,它发生在Data.Set模块的许多功能中,如下所示:
-- | /O(log n)/. Is the element in the set?
member :: Ord a => a -> Set a -> Bool
member = go
  where
    STRICT_1_OF_2(go)
    go _ Tip = False
    go x (Bin _ y l r) = case compare x y of
          LT -> go x l
          GT -> go x r
          EQ -> True
#if __GLASGOW_HASKELL__ >= 700
{-# INLINABLE member #-}
#else
{-# INLINE member #-}
#endif
我怀疑它可能与memoization有关,但我不确定.
编辑 …
haskell ×10
haskell-platform ×10
ghc ×4
cabal ×1
compilation ×1
debugging ×1
ghci ×1
haskelldb ×1
localization ×1
optimization ×1
proof ×1