import Data.List (genericLength)
len = genericLength
:t genericLength
genericLength :: (Num i) => [b] -> i
:t len
len :: [b] -> Integer
Run Code Online (Sandbox Code Playgroud)
为什么类型len
不同genericLength
?这里的目的是使用更短的别名genericLength
.
haskell中的功能不是一流的吗?不应该为功能结果赋予相同功能的其他名称吗?
我在haskell中编写了一个函数,它接受一些参数,如Word32,String(忽略currying)并输出IO Word32.现在,这是一个真正意义上的函数:对于相同的输入,输出将始终相同.没有副作用.函数返回IO Word32而不是Word32的原因是该函数在循环中多次更新许多32位线性反馈移位寄存器(lfsr)和其他寄存器,以便计算最终的Word32输出.
我的问题是:鉴于此函数实际上没有副作用,是否可以在函数实现中隐藏这些寄存器更新,以便该函数返回Word32而不是IO Word32?如果是这样,怎么样?
monads haskell functional-programming referential-transparency unsafe-perform-io
例如,使用Don Stewart编写的代码回复一些Stack Overflow问题:
import Control.Monad
import qualified Data.HashTable as H
import System.Environment
main = do
[size] <- fmap (fmap read) getArgs
m <- H.new (==) H.hashInt
forM_ [1..size] $ \n -> H.insert m n n
v <- H.lookup m 100
print v
Run Code Online (Sandbox Code Playgroud)
将其加载到GHCi中.
:t getArgs ---> getArgs :: IO [String]
:t main ---> main :: IO ()
Run Code Online (Sandbox Code Playgroud)
为什么main的类型签名没有反映出getArgs :: IO [String]
被调用的事实?
运行二进制文件时,您可以给出一个参数.
<prog> 145
返回Just 100
但是在GHCi中,你不能:main 145
给出错误.你如何在GHCi中运行这个程序并给出一个参数.